Гайд Многопоточность

Статус
В этой теме нельзя размещать новые ответы.

#Rin

Известный
Автор темы
Всефорумный модератор
1,214
1,035

Вступление
Немногие знают что в 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.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Поставить поток на паузу.
[TBODY] [/TBODY]
Познакомится с методом поближе можно на официальном сайте с документацией.
(Нажмите на метод)​
 

Вложения

  • AHK Multithreading.zip
    539.4 KB · Просмотры: 92
Последнее редактирование:

Smer4

Известный
424
51
Хз как у других но чет у меня одни ошибка Windows 7

Если скрипт скопилирован при подгрузке каждого потока" e_magic not found " а затем "Could not load Autohotkey.dll"
Или если не скоипилирован он тупо вылетает.
 

#Rin

Известный
Автор темы
Всефорумный модератор
1,214
1,035
Например для чего это можно использовать?
Запустить поток с запросом на сервер, что бы первый поток не завис.
Хз как у других но чет у меня одни ошибка Windows 7

Если скрипт скопилирован при подгрузке каждого потока" e_magic not found " а затем "Could not load Autohotkey.dll"
Или если не скоипилирован он тупо вылетает.
Я же говорил это AHK_H там много изменений в интерпретаторе и он не у всех запускается.
Если уж прям нормальная многопоточность нужна, то можно в AHK_L добавить функцию для создания второго потока интерпретации.
 
  • Нравится
Реакции: Smer4

murakami

Известный
131
13
good. but..
Это эквивалентно запуску виртуального процесса с использованием createpipe. На самом деле запустить дополнительные процессы. Это не многопоточность, которую мы хотим.
 

Smer4

Известный
424
51
Прочитал эту статью месяц назад, а научился использовать многопоток. только сейчас.
 
Статус
В этой теме нельзя размещать новые ответы.