Тема: AHK: Потоки
GUI скрипта виснет, когда выполняется какое-то другое действие. Можно ли сделать так, чтобы и GUI нормально отвечал на запросы, когда выполняется другое действие?
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
GUI скрипта виснет, когда выполняется какое-то другое действие. Можно ли сделать так, чтобы и GUI нормально отвечал на запросы, когда выполняется другое действие?
А что конкретно имеется в виду? Вообще, реально, скрипт выполняется в одном потоке. Потоки, о которых говорится в справке, это хитрость такая, позволяющая до некоторой степени имитировать многопоточность.
Если это winwait, то лучше делать отдельным скриптом. Если обычный таймер, то проблем быть не должно.
При использовании COM-функции
sURL := "http://www.autohotkey.com/download/AutoHotkeyInstall.exe"
sFile:= A_WorkingDir "\AutoHotkeyInstall.exe"
bOverWrite := True
COM_Init()
pwhr := COM_CreateObject("WinHttp.WinHttpRequest.5.1")
COM_Invoke(pwhr, "Open", "GET", sURL)
COM_Invoke(pwhr, "Send")
If psfa := COM_Invoke(pwhr, "ResponseBody")
{
pstm := COM_CreateObject("ADODB.Stream")
COM_Invoke(pstm, "Type", 1) ; adTypeBinary:=1, adTypeText:=2
COM_Invoke(pstm, "Open")
COM_Invoke_(pstm, "Write", 0x2011, psfa) ; VT_ARRAY | VT_UI1
COM_Invoke(pstm, "SaveToFile", sFile, bOverWrite ? 2:1)
COM_Invoke(pstm, "Close")
COM_Release(pstm)
COM_SafeArrayDestroy(psfa)
}
COM_Release(pwhr)
COM_Term()Трей и GUI скрипта отвечают очень долго. Используя функцию URLDownloadToFile такого уже нет. Но она привязана к IE
YMP, то-есть вообще на AHK нереально отправлять скажем запросы через функцию httpQuery в несколько потоков?
Ну, конкретно httpQuery для меня тёмный лес, никогда не ковырялся в этом. Могу только повторить то, что знаю — реальный поток у скрипта один.
И всё таки она появилась, с библиотекой Autohotkey.dll и данной сборкой Autohotkey, основа которого AHK_L: Autohotkey.dll
Проверил как работает с COM. Испытывал то, что выложил VOLK666, так что можно делать свой download manager с неглючным gui, tray и т.д. ![]()
Для запуска скрипта нам необходимы:
1. файлы из архива Autohotkey.zip (описание и оттуда же архив) - из корня архива AhkDllObject.ahk для создания из DLL объекта, AutoHotkey.dll и AutoHotkey.exe взяты из папки \Win32a\
2. COM.ahk для теста COM взят отсюда COM.zip (Тема на форуме)
Скрипт VOLK666'а просто скопипастил чтобы не морочиться и добавил циферки на выходной файл ![]()
Также скрипт лучше сохранить в UTF-8 без BOM. Версии exe\dll не Unicode, так что в gui на англ написал. Если будет желание, могу собрать все файлы в архив и выложить рабочий вариант ![]()
#Include AhkDllObject.ahk
#NoEnv
SetBatchLines, -1
;~ Переменные со скриптами для теста COM
gosub, s
;~ Количество потоков
Threads = 10
;~ Загружаем библиотеку...
Gosub, LauchThreads
;~ Запускаем тестовые потоки
Loop % Threads
dll%A_Index%.ahktextdll("#NoTrayIcon`nSetBatchLines,-1`nLoop 10`n{`nx++`nSleep 1000`n}")
;~ нам надо окно )
wh := 13*Threads
gui +alwaysontop
gui, add, text, vr w200 h%wh%
gui, add, button, gGuiClose vbtn y20 hidden, Exit
gui, show, ,Threads test
;~ Ожидаем пока все потоки завершатся, параллельно выдёргиваем переменные, обновляем окно
While ThreadsReady(Threads) != 0
{ statestr :=
Loop % Threads
statestr .= (dll%A_Index%.ahkgetvar("x") ? "Thread " A_Index "; x = " dll%A_Index%.ahkgetvar("x") : "no var") "`n"
GuiControl,, r, % statestr
Sleep 250
}
;~ Тест с COM объектами, запускаем потоки со скриптами COM
Loop 3
dll%A_Index%.ahktextdll(script%a_index%)
;~ ждём, обновляем..
While ThreadsReady(3) != 0
{
statestr :=
Loop 3
statestr .= (dll%A_Index%.ahkReady() ? "COM thread running" : "COM thread closed") "`n"
GuiControl,, r, % statestr
Sleep 250
}
GuiControl,, r, COM threads finished
GuiControl, show, btn
;~ проверяем наличие скаченных файлов )
Run % A_ScriptDir
Return
ThreadsReady(Threads) {
Loop % Threads
sum += dll%A_Index%.ahkReady()
Return sum
}
GuiClose:
ExitApp
Return
LauchThreads:
Loop % Threads
{
;~ ...под разными именами
FileMove, % ahkdll := A_Index = 1 ? "AutoHotkey.dll" : "AutoHotkey" A_Index-1 ".dll", AutoHotkey%A_Index%.dll
dll%A_Index%:=AhkdllObject("AutoHotkey" A_Index ".dll")
}
FileMove, AutoHotkey%Threads%.dll, AutoHotkey.dll
Return
s:
script1 =
(
#Include COM.ahk
sURL := "http://www.autohotkey.com/download/AutoHotkeyInstall.exe"
sFile:= A_WorkingDir "\AutoHotkeyInstall1.exe"
bOverWrite := True
COM_Init()
pwhr := COM_CreateObject("WinHttp.WinHttpRequest.5.1")
COM_Invoke(pwhr, "Open", "GET", sURL)
COM_Invoke(pwhr, "Send")
If psfa := COM_Invoke(pwhr, "ResponseBody")
{
pstm := COM_CreateObject("ADODB.Stream")
COM_Invoke(pstm, "Type", 1) ; adTypeBinary:=1, adTypeText:=2
COM_Invoke(pstm, "Open")
COM_Invoke_(pstm, "Write", 0x2011, psfa) ; VT_ARRAY | VT_UI1
COM_Invoke(pstm, "SaveToFile", sFile, bOverWrite ? 2:1)
COM_Invoke(pstm, "Close")
COM_Release(pstm)
COM_SafeArrayDestroy(psfa)
}
COM_Release(pwhr)
COM_Term()
)
script2 =
(
#Include COM.ahk
sURL := "http://www.autohotkey.com/download/AutoHotkeyInstall.exe"
sFile:= A_WorkingDir "\AutoHotkeyInstall2.exe"
bOverWrite := True
COM_Init()
pwhr := COM_CreateObject("WinHttp.WinHttpRequest.5.1")
COM_Invoke(pwhr, "Open", "GET", sURL)
COM_Invoke(pwhr, "Send")
If psfa := COM_Invoke(pwhr, "ResponseBody")
{
pstm := COM_CreateObject("ADODB.Stream")
COM_Invoke(pstm, "Type", 1) ; adTypeBinary:=1, adTypeText:=2
COM_Invoke(pstm, "Open")
COM_Invoke_(pstm, "Write", 0x2011, psfa) ; VT_ARRAY | VT_UI1
COM_Invoke(pstm, "SaveToFile", sFile, bOverWrite ? 2:1)
COM_Invoke(pstm, "Close")
COM_Release(pstm)
COM_SafeArrayDestroy(psfa)
}
COM_Release(pwhr)
COM_Term()
)
script3 =
(
#Include COM.ahk
sURL := "http://www.autohotkey.com/download/AutoHotkeyInstall.exe"
sFile:= A_WorkingDir "\AutoHotkeyInstall3.exe"
bOverWrite := True
COM_Init()
pwhr := COM_CreateObject("WinHttp.WinHttpRequest.5.1")
COM_Invoke(pwhr, "Open", "GET", sURL)
COM_Invoke(pwhr, "Send")
If psfa := COM_Invoke(pwhr, "ResponseBody")
{
pstm := COM_CreateObject("ADODB.Stream")
COM_Invoke(pstm, "Type", 1) ; adTypeBinary:=1, adTypeText:=2
COM_Invoke(pstm, "Open")
COM_Invoke_(pstm, "Write", 0x2011, psfa) ; VT_ARRAY | VT_UI1
COM_Invoke(pstm, "SaveToFile", sFile, bOverWrite ? 2:1)
COM_Invoke(pstm, "Close")
COM_Release(pstm)
COM_SafeArrayDestroy(psfa)
}
COM_Release(pwhr)
COM_Term()
)
ReturnБыло бы неплохо. А то у меня все ошибками разными плюется
Пожалуйста: архив со всеми файлами
Файлы по отдельности: AhkDllObject.ahk AutoHotkey.dll AutoHotkey.exe COM.ahk MultiThreading_test.ahk
Запуск: AutoHotkey.exe MultiThreading_test.ahk
Где можно скачать com.ahk? Нужна поддержка COM_Invoke.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться