[Полезное] Многопоточность
|
|
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
|
норм тема!
Аккаунт подтверждён [CM]Durman
|
|
|
|
Rinat_Namazov |
Дата: Четверг, 15.03.2018, 17:53 | Сообщение # 7
|
Боец
Сообщений: 122
Статус: Offline
|
Цитата Dworkin ( ) Расскажи как сделать общую переменную для потоков.
ahkassign - Присвоить значение переменной или указатель на переменную в потоке. ahkgetvar - Получить значение из переменной в потоке.
|
|
|
|