• Страница 1 из 1
  • 1
Модератор форума: Sanoxxx, Alowir, Phoenixxx_Czar  
Форум » Программирование » AHK Программирование » [Полезное] Многопоточность (Многопоточность)
[Полезное] Многопоточность
Rinat_NamazovДата: Среда, 14.03.2018, 22:05 | Сообщение # 1
Боец
Сообщений: 124
Статус: 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 - Поставить поток на паузу.


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

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



Разработка на заказ: AHK, C++ (SF/ASI), WEB (HTML, CSS, JS, PHP, SQL).
Обращаться в VK: <ТыК>​


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

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

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

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



Разработка на заказ: AHK, C++ (SF/ASI), WEB (HTML, CSS, JS, PHP, SQL).
Обращаться в VK: <ТыК>​


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

Есть же ObjShare.


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

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


ahkassign - Присвоить значение переменной или указатель на переменную в потоке.
ahkgetvar - Получить значение из переменной в потоке.



Разработка на заказ: AHK, C++ (SF/ASI), WEB (HTML, CSS, JS, PHP, SQL).
Обращаться в VK: <ТыК>​
Форум » Программирование » AHK Программирование » [Полезное] Многопоточность (Многопоточность)
  • Страница 1 из 1
  • 1
Поиск:
Статистика Форума
Последнии темы Читаемые темы Лучшие пользователи Новые пользователи
[Arizona RP] Софт для ло...

[ARP] Автоматический Фар...

Аккаунт на Samp-Rp |...

100% телепорт на любые д...

Аккаунт на Samp-Rp |...

[NEW] Крашер для Аризоны...

Дешевая накрутка гта 5 о...

Заказ: №2024720 | V...

Титан Вип Брейнбург

Плагины+клео для ловли н...

◄►СКУПАЮ STEAM - 24/7 [C...

СЛИВ ПРИВАТНОГО СКРИПТА ...

[0.3z][RUS] S0beit mo... [10001]

Курилка [10000]

Поиск CLEO скриптов &... [9988]

Флудильная [9936]

Курилка [9688]

RakBot - Качай аккаун... [9626]

Курилка [9614]

Общение читеров [CM] [9546]

S0beit - pr9n project... [9494]

Часто задаваемые вопр... [8232]

♔DIAMOND♚ADVANCE RADM... [6287]

[0.3.7][RUS] Sobeit m... [6246]

[FREE] AntiAFK_R 3.4.... [6220]

АК_47 [33556]

GеNius [7097]

[CM]Russel [5569]

romka619 [5010]

[CM]AGRESSOR [4644]

Сэс [4407]

Snake_Firm [4378]

Artem_Buero [4210]

[CM]Durman [3136]

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

iMaddy [2858]

sky_Woker [2856]

Sa1nteD [2676]

SanSayB0y [15:23]

laRRYbLACK [15:22]

123652 [15:21]

Ed1son [15:20]

Dnsnsnnd [15:12]

Sufferik [15:06]

Richi17 [15:05]

KatanaSuki [14:55]

Lorianio [14:49]

vipvorobey95 [14:46]

Kinder_Surpriz [14:36]

Evgesha023 [14:29]

Xavier_Scott [14:24]


CM Team © 2009-2018 Администрация не несёт ответственности за размещённые материалы. Условия пользования
Все материалы предоставлены в ознакомительных целях и администрация предлагает удалить их после ознакомления.

Положение о защите персональных данных на сайте, Пользовательское соглашение, Договор оказания услуг.