[Полезное] Многопоточность - Форум Cheat-Master.ru
  • Страница 1 из 1
  • 1
Модератор форума: Sanoxxx, Alowir, Phoenixxx_Czar  
[Полезное] Многопоточность
Rinat_Namazov Дата: Среда, 14.03.2018, 22:05 | Сообщение # 1
Боец
Сообщений: 122
Статус: Offline
Вступление

Немногие знают что в AHK можно использовать многопоточность, хот и выглядит это странно.
Стандартный движок AHK всего лишь эмулирует многопоточность, хотя фактический она использует только один поток.
Эмуляция потоков идет по следующему принципу:
Вы нажали на горячую клавишу, начался "поток".
Вы нажали вторую горячую клавишу, но при этом 1-ый "поток" не отработал свои действия.
Тогда 1-ый "поток" приостановится, и главным "потоком" станет 2-ой, после того как он окончиться, 1-ый "поток" разморозиться и так далее.
В документации так же описано что можно ставить приоритет каждого "потока".
Но все же если скачивать какой-то слишком тяжелый файл, весь скрипт подвиснет.

Выход есть, можно подгрузить в наш исполняемый файл еще один или даже несколько интерпретаторов.
Кто не в курсе, то в AHK_H появилась возможность "компиляции" в Dll.
А заботливый HotKeyIt написал библиотеку для подгрузки голого ahk dll в наш exe.

Инструкция
Подгружать наши интерпретаторы мы можем где-то в начале, так как это занимает несколько секунд, в зависимости сколько копий вы подгрузите
После подгрузки мы можем отправить ему, свой код и продолжить работать в главном потоке.
Также если на уже работающий интерпретатор кинуть код повторно, он прекратить выполнять текущий код и выполнить новый, из этого следует мы можем например выводить MsgBox и сами закрывать его, не ожидая закрытия MsgBox пользователем.
Все потоки автоматический завершаются после окончания выполнения кода, если не применить директиву "#Persistent"
Но есть только один минус, эти dll файлы работают на основе AHK_H, а он из-за не пофикшеного до сих пор бага, работает не у всех, обычно на Windows 10.
И если даже скрипт запускается, есть вероятность того что все символы превратятся в вопросики ("?????").
В архиве, находящимся во вложении прилагаю все библиотеки и пример кода.
Так же если вы компилируете свой скрипт, обязательно включите dll в ресурсы своего exe.

Код
FileInstall, AutoHotkey.dll, AutoHotkey.dll

Подгрузить AutoHotkey.dll можно следующим кодом:
Код
AhkThread := AhkDllThread("AutoHotkey.dll")

А отправить ей на выполнение код:
Код
AhkThread.ahktextdll("MsgBox, Test")

А удобно записывать код, можно так:
Код
code =
(
MsgBox, Test
Test_Var := 228
MsgBox, Test Var: %Test_Var%
)

Но можно и в другов виде хранить, например хранить код в HEX'e и переводить в String во время отправки, т.к на некоторые символы AHK будет ругаться.

Список доступных методов взаимодействия с потоками.
Выполняются они по следующему виду:
Код
Переменная := AhkDllThread("AutoHotkey.dll") ; Подгрузка интерпретатора
Переменная.Метод(Переменные при необходимости)



ahkdll - Загрузить новый поток с кодом из файла, текущий поток будет прекращен.
ahktextdll - Загрузить новый поток с кодом из строки/памяти/переменной, текущий поток будет прекращен.
ahkReady - Возвращает 1 (True), если поток выполняется в данное время. Возвращает 0 (False) если поток не выполняется в данное време.
ahkTerminate - Завершить поток.
ahkReload - Перезагрузить поток, будет использоваться последний код с ahkdll или ahktextdll.
ahkFunction - Вызывать функцию из потока через SendMessage.
ahkPostFunction - Вызывать функцию из потока через PostMessage.
ahkExecuteLine - Выполняет код из определенной строки в потоке.
ahkLabel - Вызвать Goto (PostMessage) или GoSub (SendMessage) в потоке
ahkFindFunction - Найти функцию в потоке и возвратить его указатель.
ahkFindLabel - Найти метку в потоке и возвратить его указатель.
addFile - Добавить и при необходимости выполнить в потоке дополнительный код из файла.
addScript - Добавить и при необходимости выполнить в потоке дополнительный код из строки/памяти/переменной.
ahkExec - Временно выполнить в потоке код из строки/памяти/переменной.
ahkassign - Присвоить значение переменной или указатель на переменную в потоке.
ahkgetvar - Получить значение из переменной в потоке.
ahkPause - Поставить поток на паузу.


Познакомится с методом поближе можно на официальном сайте с документацией.
(Нажмите на метод)

Скачать: *ТыК*


Сообщение отредактировал Rinat_Namazov - Четверг, 15.03.2018, 17:53
Dworkin Дата: Среда, 14.03.2018, 23:42 | Сообщение # 2
Боец
Сообщений: 110
Статус: Offline
Сам собирал все библиотеки(инклуды) в одно место или откуда-то скачал?)
Расскажи как сделать общую переменную для потоков.
Rinat_Namazov Дата: Четверг, 15.03.2018, 00:16 | Сообщение # 3
Боец
Сообщений: 122
Статус: Offline
Цитата Dworkin ()
Сам собирал все библиотеки(инклуды) в одно место или откуда-то скачал?)

Первый раз о ahk dll увидел на офф.сайте ахк год назад.
Но тогда мало чё знал вообще в принципе, т.к старый форум ахк ломали и все библиотеки слились.
Ну можно скачать ручную установку AHK H там в папке lib есть все файлы, AutoHotkey.dll ansi в win32a. Да и они на гитхабе разбросаны.
Ток сегодня подумал выложить суда это.

Цитата Dworkin ()
Расскажи как сделать общую переменную для потоков.

Самый тупой способ это ini файлы, ещё умнее это реестр.
Ну как я думаю лучше через память, т.е strput и strget.
Потом может нашаманю.


Сообщение отредактировал Rinat_Namazov - Четверг, 15.03.2018, 00:23
Wyareri Дата: Четверг, 15.03.2018, 01:20 | Сообщение # 4
Боец
Сообщений: 56
Статус: Offline
Словами трудно выразить мою благодарность.
Я уже так задолбался с однопоточностью.
Респект.
Dworkin Дата: Четверг, 15.03.2018, 02:27 | Сообщение # 5
Боец
Сообщений: 110
Статус: Offline
Я сам не так уж давно искал и методом тыка собирал то что бы работало именно на AHK_L. Подумал что может ты мою сборку нашел.
Цитата Dworkin ()
Расскажи как сделать общую переменную для потоков.

Есть же ObjShare.


Сообщение отредактировал Dworkin - Четверг, 15.03.2018, 02:28
Моряк Дата: Четверг, 15.03.2018, 03:05 | Сообщение # 6
Новичок
Сообщений: 23
Статус: Offline
норм тема! tongue

Аккаунт подтверждён [CM]Durman
Rinat_Namazov Дата: Четверг, 15.03.2018, 17:53 | Сообщение # 7
Боец
Сообщений: 122
Статус: Offline
Цитата Dworkin ()
Расскажи как сделать общую переменную для потоков.


ahkassign - Присвоить значение переменной или указатель на переменную в потоке.
ahkgetvar - Получить значение из переменной в потоке.
  • Страница 1 из 1
  • 1
Поиск:
Статистика Форума
Лучшие пользователи
Admin [39113]

GеNius [7210]

[CM]Russel [5557]

kenlo763 [4952]

[CM]AGRESSOR [4639]

Snake_Firm [4452]

Сэс [4416]

Artem_Buero [4223]

[CM]Durman [3204]

[CM]Рафаэль [3080]

iMaddy [2855]

sky_Woker [2854]

getrekt [2745]

Новые пользователи