1

Тема: AHK: Потоки

GUI скрипта виснет, когда выполняется какое-то другое действие. Можно ли сделать так, чтобы и GUI нормально отвечал на запросы, когда выполняется другое действие?

2

Re: AHK: Потоки

А что конкретно имеется в виду? Вообще, реально, скрипт выполняется в одном потоке. Потоки, о которых говорится в справке, это хитрость такая, позволяющая до некоторой степени имитировать многопоточность.

3

Re: AHK: Потоки

Если это winwait, то лучше делать отдельным скриптом. Если обычный таймер, то проблем быть не должно.

4 (изменено: VOLK666, 2010-10-20 19:46:34)

Re: AHK: Потоки

При использовании 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 в несколько потоков?

5

Re: AHK: Потоки

Ну, конкретно httpQuery для меня тёмный лес, никогда не ковырялся в этом. Могу только повторить то, что знаю — реальный поток у скрипта один.

6 (изменено: ayosh, 2010-10-21 02:14:40)

Re: AHK: Потоки

И всё таки она появилась, с библиотекой 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

7

Re: AHK: Потоки

Было бы неплохо. А то у меня все ошибками разными плюется

8

Re: AHK: Потоки

Пожалуйста: архив со всеми файлами
Файлы по отдельности: AhkDllObject.ahk AutoHotkey.dll AutoHotkey.exe COM.ahk MultiThreading_test.ahk

Запуск: AutoHotkey.exe MultiThreading_test.ahk

9

Re: AHK: Потоки

Где можно скачать com.ahk? Нужна поддержка COM_Invoke.