- 1,214
- 1,043
Вступление
Немногие знают что в AHK можно использовать многопоточность, хот и выглядит это странно.
Стандартный движок AHK всего лишь эмулирует многопоточность, хотя фактический она использует только один поток.
Эмуляция потоков идет по следующему принципу:
Вы нажали на горячую клавишу, начался "поток".
Вы нажали вторую горячую клавишу, но при этом 1-ый "поток" не отработал свои действия.
Тогда 1-ый "поток" приостановится, и главным "потоком" станет 2-ой, после того как он окончиться, 1-ый "поток" разморозиться и так далее.
В документации так же описано что можно ставить приоритет каждого "потока".
Но все же если скачивать какой-то слишком тяжелый файл, весь скрипт подвиснет.
Выход есть, можно подгрузить в наш исполняемый файл еще один или даже несколько интерпретаторов.
Кто не в курсе, то в AHK_H появилась возможность "компиляции" в Dll.
А заботливый HotKeyIt написал библиотеку для подгрузки голого ahk dll в наш exe.
Инструкция
Подгружать наши интерпретаторы мы можем где-то в начале, так как это занимает несколько секунд, в зависимости сколько копий вы подгрузите
После подгрузки мы можем отправить ему, свой код и продолжить работать в главном потоке.
Также если на уже работающий интерпретатор кинуть код повторно, он прекратить выполнять текущий код и выполнить новый, из этого следует мы можем например выводить MsgBox и сами закрывать его, не ожидая закрытия MsgBox пользователем.
Все потоки автоматический завершаются после окончания выполнения кода, если не применить директиву "#Persistent"
Но есть только один минус, эти dll файлы работают на основе AHK_H, а он из-за не пофикшеного до сих пор бага, работает не у всех, обычно на Windows 10.
И если даже скрипт запускается, есть вероятность того что все символы превратятся в вопросики ("?????").
В архиве, находящимся во вложении прилагаю все библиотеки и пример кода.
Так же если вы компилируете свой скрипт, обязательно включите dll в ресурсы своего exe.
AutoHotKey:
FileInstall, AutoHotkey.dll, AutoHotkey.dll
AutoHotKey:
AhkThread := AhkDllThread("AutoHotkey.dll")
AutoHotKey:
AhkThread.ahktextdll("MsgBox, Test")
AutoHotKey:
code =
(
MsgBox, Test
Test_Var := 228
MsgBox, Test Var: `%Test_Var`%
)
Выполняются они по следующему виду:
AutoHotKey:
Переменная := 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 | Поставить поток на паузу. |
(Нажмите на метод)
Вложения
Последнее редактирование: