Что нового

[Сеть, интернет] Асинхронный WinHTTP, WinInet, многопоточность

Luke

Знающий
Сообщения
64
Репутация
14
Подскажите как реализовать асинхронный режим работы WinHTTP. Например есть такой код (Proxy Checker):

Код:
#cs ----------------------------------------------------------------------------
	
	AutoIt Version: 3.3.2.0
	Author:         Luke
	
	Script Function: test proxy
	Template AutoIt script.
	
#ce ----------------------------------------------------------------------------
#include <Inet.au3>
#include "WinHTTP.au3"

HotKeySet("^{F9}", "Terminate") ;Назначение горячей клавиши. При нажатии ctrl+F9 скрипт закончит свою работу

Dim $MyPublicIP = _GetIP(), $Stop = 0
Dim $sFileProxy = @ScriptDir & "\proxy.txt"
Dim $sFileGoodProxy = @ScriptDir & "\GoodProxy.txt"

ButtonStartClick()

Func ButtonStartClick()
	; инициируем WinHTTP;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	$hOpen = _WinHttpOpen("testUtility")
	If @error Then
		MsgBox(48, "Error", "Error initializing the usage of WinHTTP functions.")
		Return SetError(1)
	EndIf
	_WinHttpSetTimeouts($hOpen, 0, 20000, 10000, 10000)
	_WinHttpSetOption($hOpen, $WINHTTP_OPTION_DISABLE_FEATURE, $WINHTTP_DISABLE_COOKIES)
	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


	$hFileProxy = FileOpen($sFileProxy, 0)
	If $hFileProxy = -1 Then
		MsgBox(0, "Error", "Unable to open file.")
		_WinHttpCloseHandle($hOpen)
		Return SetError(1)
	EndIf

	;главный цикл;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	While $Stop = 0
		$Proxy = FileReadLine($hFileProxy)
		If @error = -1 Then
			ExitLoop
		EndIf
		$address = "208.78.70.70"
		$zapros = "/?rnd1=" & Random(1, 65536) & "&rnd2=" & Random(1, 65536)
		$CheckProxy = fZapros($hOpen, $zapros, $address, $Proxy)
		If Not @error And TempIP($CheckProxy[2]) <> $MyPublicIP And Not @error Then
			ConsoleWrite(TempIP($CheckProxy[2]) & @CRLF)
			FileWriteLine($sFileGoodProxy, $Proxy)
		Else
			ConsoleWrite("Прокси " & $Proxy & " неподходит" & @TAB & $CheckProxy[0] & @CRLF)
		EndIf
	WEnd
	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

	ConsoleWrite("Закончил" & @CRLF)
	FileClose($hFileProxy)
	_WinHttpCloseHandle($hOpen)

EndFunc   ;==>ButtonStartClick

Func TempIP($strokaIP)
	$strokaIP = StringTrimLeft($strokaIP, StringInStr($strokaIP, ":") + 1)
	$strokaIP = StringTrimRight($strokaIP, StringLen($strokaIP) - StringInStr($strokaIP, "/") + 2)
	$t_ip = StringSplit($strokaIP, '.')
	If $t_ip[0] = 4 And StringIsDigit($t_ip[1]) And StringIsDigit($t_ip[2]) And StringIsDigit($t_ip[3]) And StringIsDigit($t_ip[4]) Then
		Return $strokaIP
	EndIf
	Return SetError(1, 0, -1)
EndFunc   ;==>TempIP

Func fZapros($hInternet, $pzapros, $paddress, $pProxy = "")
	Dim $result[3]
	If $pProxy <> "" Then
		WinHttpSetProxy($hInternet, $pProxy)
		If @error Then
			$result[0] = "Error specifying proxy."
			SetError(1)
			Return $result
		EndIf
	EndIf
	$hConnect = _WinHttpConnect($hInternet, $paddress)
	If @error Then
		$result[0] = "Error specifying the initial target server of an HTTP request."
		SetError(2)
		Return $result
	EndIf
	$h_openRequest = _WinHttpOpenRequest($hConnect, "GET", $pzapros)
	If @error Then
		$result[0] = "Error creating request handle."
		_WinHttpCloseHandle($hConnect)
		SetError(3)
		Return $result
	EndIf
	_WinHttpSendRequest($h_openRequest)
	If @error Then
		$result[0] = "Error sending specified request."
		_WinHttpCloseHandle($hConnect)
		SetError(4)
		Return $result
	EndIf
	_WinHttpReceiveResponse($h_openRequest)
	If _WinHttpQueryDataAvailable($h_openRequest) = 1 Then
		$header = _WinHttpQueryHeaders($h_openRequest)
		Dim $sChunk = "", $sData = ""
		While 1
			$sChunk = _WinHttpReadData($h_openRequest)
			If @error Then ExitLoop
			$sData = $sData & $sChunk
		WEnd
		$result[1] = $header
		$result[2] = $sData
	Else
		$result[0] = "Site is experiencing problems."
	EndIf
	_WinHttpCloseHandle($h_openRequest)
	_WinHttpCloseHandle($hConnect)
	If $result[0] = "Site is experiencing problems." Then SetError(5)
	Return $result

EndFunc   ;==>fZapros
Func WinHttpSetProxy($hInternet, $pProxy, $pProxyBypass = "<local>", $iAccessType = $WINHTTP_ACCESS_TYPE_NAMED_PROXY)

	Local $tProxy = DllStructCreate("wchar[" & StringLen($pProxy) + 1 & "]")
	DllStructSetData($tProxy, 1, $pProxy)

	Local $tProxyBypass = DllStructCreate("wchar[" & StringLen($pProxyBypass) + 1 & "]")
	DllStructSetData($tProxyBypass, 1, $pProxyBypass)

	Local $tWINHTTP_PROXY_INFO = DllStructCreate("dword AccessType;" & _
			"ptr Proxy;" & _
			"ptr ProxyBypass")

	DllStructSetData($tWINHTTP_PROXY_INFO, "AccessType", $iAccessType)
	DllStructSetData($tWINHTTP_PROXY_INFO, "Proxy", DllStructGetPtr($tProxy))
	DllStructSetData($tWINHTTP_PROXY_INFO, "ProxyBypass", DllStructGetPtr($tProxyBypass))
	Local $a_iCall = DllCall("winhttp.dll", "int", "WinHttpSetOption", _
			"hwnd", $hInternet, _
			"dword", $WINHTTP_OPTION_PROXY, _
			"ptr", DllStructGetPtr($tWINHTTP_PROXY_INFO), _
			"dword", DllStructGetSize($tWINHTTP_PROXY_INFO))
	If @error Or Not $a_iCall[0] Then
		Return SetError(1, 0, 0)
	EndIf

	Return SetError(0, 0, 1)

EndFunc   ;==>WinHttpSetProxy
Func Terminate()
	ConsoleWrite("-СТОП-" & @CRLF)
	$Stop = 1
EndFunc   ;==>Terminate


Но он работает ужасно медленно, кроме того GUI перестаёт перерисовываться и реагировать на события если вызвать эту функцию. А всё из-за того что скрипт ждёт ответа в winHTTP , который будет в случае отсутствия прокси только спустя десятки секунд. Прочитал что winHTTP может посылать следующий запрос не дожидаясь ответа на предыдущий, но как это реализовать незнаю.
Используемые файлы:
WinHTTP.au3
WinHTTPConstants.au3
proxy.txt
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Re: [Сеть, интернет] Асинхронный WinHTTP

Luke [?]
А разве эта библиотека входит в стандартный состав пакета AutoIt?
 
Автор
L

Luke

Знающий
Сообщения
64
Репутация
14
Re: [Сеть, интернет] Асинхронный WinHTTP

Забыл, не входит, вот используемые файлы:
 
Автор
L

Luke

Знающий
Сообщения
64
Репутация
14
Re: [Сеть, интернет] Асинхронный WinHTTP

Вообщем с помощью WinHTTP так и не получилось сделать, единственная многопоточная функция АutoIT к сожалению реализована разработчиками через устаревший WinInet, который имеет жёсткие ограничения на кол-во реально работающих соединений (вроде 4) и соответственно большее количество потоков не приводит к ускорению, очень жаль. Вот остановился на таком варианте (10 потоков, можно подкрутить для теста):
Код:
#cs ----------------------------------------------------------------------------

	AutoIt Version: 3.3.2.0
	Author:         Luke

	Script Function: test proxy
	Template AutoIt script.

#ce ----------------------------------------------------------------------------
#include <Inet.au3>
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiStatusBar.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
Opt("GUIOnEventMode", 1)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Global $MyPublicIP = _GetIP(), $Stop = 1, $Paused, $sBeginTime = 0
Global $sFileProxy = @ScriptDir & "\proxy.txt"
Global $sFileOut = @ScriptDir & "\GoodProxy.txt"
Global $CountThread = 0, $iMaxThread = 10, $iCurrentProxy, $iFreeThread = 1, $CountClosed = 0, $CountGoodProxy = 0
Global $aProxy[1] = [0]
Global $hDownload[($iMaxThread + 1)][2]
InitArray($hDownload)

HotKeySet("^{F9}", "Terminate") ;Назначение горячей клавиши. При нажатии ctrl+F9 скрипт закончит свою работу
HotKeySet("{PAUSE}", "TogglePause") ;Назначение горячей клавиши. При нажатии Pause Break скрипт встанет на паузу
OnAutoItExitRegister("Cleanup")

#Region ### START Koda GUI section ### Form=d:\development\raznoe\test_proxy.kxf
Global $Test_Proxy = GUICreate("Test_Proxy", 633, 447, -1, -1)
GUISetOnEvent($GUI_EVENT_CLOSE, "Test_ProxyClose")
GUISetOnEvent($GUI_EVENT_MINIMIZE, "Test_ProxyMinimize")
GUISetOnEvent($GUI_EVENT_MAXIMIZE, "Test_ProxyMaximize")
GUISetOnEvent($GUI_EVENT_RESTORE, "Test_ProxyRestore")
Global $GroupSetting = GUICtrlCreateGroup("Настройки", 8, 0, 617, 73)
Global $InputProxy = GUICtrlCreateInput("Input file Proxy", 128, 16, 401, 21)
GUICtrlSetOnEvent($InputProxy, "InputProxyChange")
Global $ButtonProxy = GUICtrlCreateButton("Выбрать", 536, 14, 75, 25, $WS_GROUP)
GUICtrlSetOnEvent($ButtonProxy, "ButtonProxyClick")
Global $InputOutFile = GUICtrlCreateInput("Input file Out", 128, 40, 401, 21)
GUICtrlSetOnEvent($InputOutFile, "InputOutFileChange")
Global $ButtonOutFile = GUICtrlCreateButton("Выбрать", 536, 38, 75, 25, $WS_GROUP)
GUICtrlSetOnEvent($ButtonOutFile, "ButtonOutFileClick")
Global $LabelProxy = GUICtrlCreateLabel("Файл с прокси", 16, 20, 81, 17)
GUICtrlSetOnEvent($LabelProxy, "LabelProxyClick")
Global $LabelOutFile = GUICtrlCreateLabel("Выходной файл", 16, 44, 83, 17)
GUICtrlSetOnEvent($LabelOutFile, "LabelOutFileClick")
GUICtrlCreateGroup("", -99, -99, 1, 1)
Global $StatusBar1 = _GUICtrlStatusBar_Create($Test_Proxy)
Global $StatusBar1_PartsWidth[3] = [160, 520, -1]
_GUICtrlStatusBar_SetParts($StatusBar1, $StatusBar1_PartsWidth)
_GUICtrlStatusBar_SetText($StatusBar1, "Part 1", 0)
_GUICtrlStatusBar_SetText($StatusBar1, "Part 2", 1)
_GUICtrlStatusBar_SetText($StatusBar1, @TAB & "Part 3", 2)
_GUICtrlStatusBar_SetMinHeight($StatusBar1, 25)
Global $GroupButton = GUICtrlCreateGroup("Проверка прокси", 8, 368, 617, 49)
Global $ButtonStart = GUICtrlCreateButton("Старт", 16, 384, 81, 25, $WS_GROUP)
GUICtrlSetOnEvent($ButtonStart, "ButtonStartClick")
Global $ButtonStop = GUICtrlCreateButton("Стоп (Ctrl+F9)", 104, 384, 75, 25, $WS_GROUP)
GUICtrlSetOnEvent($ButtonStop, "ButtonStopClick")
Global $ButtonPause = GUICtrlCreateButton("Пауза", 184, 384, 75, 25, $WS_GROUP)
GUICtrlSetOnEvent($ButtonPause, "ButtonPauseClick")
GUICtrlCreateGroup("", -99, -99, 1, 1)
Global $GroupRezult = GUICtrlCreateGroup("Результаты", 8, 72, 617, 297)
Global $EditBad = GUICtrlCreateEdit("", 16, 104, 297, 105)
GUICtrlSetData($EditBad, "")
GUICtrlSetOnEvent($EditBad, "EditBadChange")
Global $EditGood = GUICtrlCreateEdit("", 320, 104, 297, 105)
GUICtrlSetData($EditGood, "")
GUICtrlSetOnEvent($EditGood, "EditGoodChange")
Global $LabelBad = GUICtrlCreateLabel("Нерабочие и прозрачные прокси", 16, 88, 171, 17)
GUICtrlSetOnEvent($LabelBad, "LabelBadClick")
Global $LabelGood = GUICtrlCreateLabel("Анонимные прокси", 320, 88, 102, 17)
GUICtrlSetOnEvent($LabelGood, "LabelGoodClick")
Global $EditLog = GUICtrlCreateEdit("", 16, 229, 601, 129)
GUICtrlSetData($EditLog, "")
GUICtrlSetOnEvent($EditLog, "EditLogChange")
Global $LabelLog = GUICtrlCreateLabel("Лог", 15, 214, 23, 17)
GUICtrlSetOnEvent($LabelLog, "LabelLogClick")
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

;дальше рисую гуи без коды
_GUICtrlStatusBar_SetText($StatusBar1, @TAB & $MyPublicIP, 2)
; Встраиваю progress bar в статус бар
Global $progress = GUICtrlCreateProgress(0, 0, -1, -1)
Global $hProgress = GUICtrlGetHandle($progress)
_GUICtrlStatusBar_EmbedControl($StatusBar1, 0, $hProgress)
Global $PosProgress = ControlGetPos("", "", $progress)
Global $PosStatusBar1 = ControlGetPos("", "", $StatusBar1)
;устанавливаю значения по умолчанию
GUICtrlSetData($InputProxy, $sFileProxy)
GUICtrlSetData($InputOutFile, $sFileOut)
GUICtrlSetState($ButtonStop, $GUI_DISABLE)
GUICtrlSetState($ButtonPause, $GUI_DISABLE)

;~ ConsoleWrite(@TempDir & @CRLF)

While 1
	If $Stop = 0 Then
		If $CountThread < $iMaxThread And $iCurrentProxy < $aProxy[0] Then
			$iCurrentProxy = $iCurrentProxy + 1
			$iFreeThread = FreeThread($hDownload)
			If @error Then
				MsgBox(0, "Error", "Нет свободных потоков")
				Exit
			EndIf
			GUICtrlSetData($EditLog, WorkTime() & " Проверяю прокси:" & $aProxy[$iCurrentProxy] & @CRLF, 1)
			;сюда вставить функцию которая делает запрос через прокси
			;INTERNET_OPTION_MAX_CONNS_PER_SERVER
			If HttpSetProxy(2, $aProxy[$iCurrentProxy]) = 0 Then
				MsgBox(0, "Error", "Не могу установить прокси")
				Exit
			EndIf
			$hDownload[$iFreeThread][0] = InetGet("http://checkip.dyndns.org/?rnd1=" & Random(1, 65536) & "&rnd2=" & Random(1, 65536), _
					@TempDir & "\Download_" & $iFreeThread & ".dat", 1, 1)
			; конец заглушки
			$hDownload[$iFreeThread][1] = $iCurrentProxy
			$CountThread = $CountThread + 1
		EndIf
	EndIf
	If $CountThread > 0 Then
		_GUICtrlStatusBar_SetText($StatusBar1, WorkTime() & " Проверяю " & $iCurrentProxy & " из " & $aProxy[0], 1)
		For $i = 1 To (UBound($hDownload, 1) - 1)
			If $hDownload[$i][0] <> -1 Then
				If InetGetInfo($hDownload[$i][0], 2) = 1 Then
					If InetGetInfo($hDownload[$i][0], 3) = 1 And TempIP($i) <> $MyPublicIP And Not @error Then
						$CountGoodProxy = $CountGoodProxy + 1
						ConsoleWrite("Анонимная прокси: " & $aProxy[$hDownload[$i][1]] & @CRLF)
						GUICtrlSetData($EditLog, WorkTime() & " Анонимных - " & $CountGoodProxy & ", Плохих - " & ($CountClosed + 1 - $CountGoodProxy) & _
								" Определяемый IP - " & TempIP($i) & " , анонимная прокси: " & $aProxy[$hDownload[$i][1]] & @CRLF, 1)
						FileWriteLine($sFileOut, $aProxy[$hDownload[$i][1]])
						GUICtrlSetData($EditGood, $aProxy[$hDownload[$i][1]] & @CRLF, 1)
					Else
						ConsoleWrite("Прокси " & $aProxy[$hDownload[$i][1]] & " не подходит" & @CRLF)
						GUICtrlSetData($EditLog, WorkTime() & " Анонимных - " & $CountGoodProxy & ", Плохих - " & ($CountClosed + 1 - $CountGoodProxy) & _
								" Прокси " & $aProxy[$hDownload[$i][1]] & " не подходит" & @CRLF, 1)
						GUICtrlSetData($EditBad, $aProxy[$hDownload[$i][1]] & @CRLF, 1)
					EndIf
					InetClose($hDownload[$i][0]); закрываем этот запрос
					$hDownload[$i][0] = -1
					$hDownload[$i][1] = 0
					$CountThread = $CountThread - 1
					DelFile($i)
					$CountClosed = $CountClosed + 1
					GUICtrlSetData($progress, ($CountClosed / $aProxy[0] * 100))
				EndIf
			EndIf
		Next
	Else
		_GUICtrlStatusBar_SetText($StatusBar1, "Бездействую ", 1)
	EndIf
	Sleep(100)
WEnd

Func ButtonOutFileClick()
	$sFileOut = FileSaveDialog("Выберите файл для записи результатов", @ScriptDir, "Текстовые файлы (*.txt)|Все файлы (*.*)", 0, "GoodProxy.txt")
	GUICtrlSetData($InputOutFile, $sFileOut)
EndFunc   ;==>ButtonOutFileClick
Func ButtonPauseClick()
	TogglePause()
EndFunc   ;==>ButtonPauseClick
Func ButtonProxyClick()
	$sFileProxy = FileOpenDialog("Выберите файл с proxy", @ScriptDir, "Текстовые файлы (*.txt)|Все файлы (*.*)", 1)
	GUICtrlSetData($InputProxy, $sFileProxy)
EndFunc   ;==>ButtonProxyClick
Func ButtonStopClick()
	GUICtrlSetState($ButtonStop, $GUI_DISABLE)
	GUICtrlSetState($ButtonPause, $GUI_DISABLE)
	Terminate()
	GUICtrlSetState($ButtonProxy, $GUI_ENABLE)
	GUICtrlSetState($ButtonOutFile, $GUI_ENABLE)
	GUICtrlSetState($ButtonStart, $GUI_ENABLE)
EndFunc   ;==>ButtonStopClick
Func Test_ProxyClose()
	Exit
EndFunc   ;==>Test_ProxyClose
Func Test_ProxyMaximize()

EndFunc   ;==>Test_ProxyMaximize
Func Test_ProxyMinimize()

EndFunc   ;==>Test_ProxyMinimize
Func Test_ProxyRestore()
	GUICtrlSetPos($progress, $PosProgress[0] - $PosStatusBar1[0], $PosProgress[1] - $PosStatusBar1[1], $PosProgress[2], $PosProgress[3])
EndFunc   ;==>Test_ProxyRestore
Func EditBadChange()

EndFunc   ;==>EditBadChange
Func EditGoodChange()

EndFunc   ;==>EditGoodChange
Func EditLogChange()

EndFunc   ;==>EditLogChange
Func InputOutFileChange()
	$sFileOut = GUICtrlRead($InputOutFile)
EndFunc   ;==>InputOutFileChange
Func InputProxyChange()
	$sFileProxy = GUICtrlRead($InputProxy)
EndFunc   ;==>InputProxyChange
Func LabelBadClick()

EndFunc   ;==>LabelBadClick
Func LabelGoodClick()

EndFunc   ;==>LabelGoodClick
Func LabelLogClick()

EndFunc   ;==>LabelLogClick
Func LabelOutFileClick()

EndFunc   ;==>LabelOutFileClick
Func LabelProxyClick()

EndFunc   ;==>LabelProxyClick

Func ButtonStartClick()
	GUICtrlSetState($ButtonStart, $GUI_DISABLE)
	GUICtrlSetState($ButtonProxy, $GUI_DISABLE)
	GUICtrlSetState($ButtonOutFile, $GUI_DISABLE)
	GUICtrlSetData($progress, 0)
	$sBeginTime = TimerInit()
	HttpSetUserAgent("Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.3) Gecko/20100401 MRA 5.3 (build 02552) Firefox/3.6.3 (.NET CLR 3.5.30729)")
	$Stop = 0
	$iCurrentProxy = 0
	$CountClosed = 0
	$CountGoodProxy = 0
	$CountThread = 0
	$iFreeThread = 1
	InitArray($hDownload)
	Global $aProxy = ReadFile($sFileProxy)
	GUICtrlSetState($ButtonStop, $GUI_ENABLE)
	GUICtrlSetState($ButtonPause, $GUI_ENABLE)
EndFunc   ;==>ButtonStartClick

Func TempIP($x)
	$hFile = FileOpen(@TempDir & "\Download_" & $x & ".dat", 0)
	If $hFile = -1 Then
		MsgBox(0, "Error", "Не могу прочитать файл с ответом " & @TempDir & "\Download_" & $x & ".dat")
		Exit
	EndIf
	$strokaIP = FileRead($hFile)
	FileClose($hFile)
	$strokaIP = StringTrimLeft($strokaIP, StringInStr($strokaIP, ":") + 1)
	$strokaIP = StringTrimRight($strokaIP, StringLen($strokaIP) - StringInStr($strokaIP, "/") + 2)
	$t_ip = StringSplit($strokaIP, '.')
	If $t_ip[0] = 4 And StringIsDigit($t_ip[1]) And StringIsDigit($t_ip[2]) And StringIsDigit($t_ip[3]) And StringIsDigit($t_ip[4]) Then
		Return $strokaIP
	EndIf
	Return SetError(1, 0, -1)
EndFunc   ;==>TempIP

Func ReadFile($sFile) ;Возвращает массив из строк файла, в нулевом элементе - общее количество строк файла
	Local $sFileStroka[1]
	$hFile = FileOpen($sFile, 0)
	If $hFile = -1 Then
		MsgBox(0, "Error", "Unable to open file.")
		Return SetError(1)
	EndIf
	While 1
		$sTempStroka = FileReadLine($hFile)
		If @error = -1 Then
			ExitLoop
		EndIf
		$sFileStroka[0] = $sFileStroka[0] + 1
		ReDim $sFileStroka[($sFileStroka[0] + 1)]
		$sFileStroka[$sFileStroka[0]] = $sTempStroka
	WEnd
	FileClose($hFile)
	Return $sFileStroka
EndFunc   ;==>ReadFile

Func InitArray(ByRef $array)
	For $i = 0 To (UBound($array, 1) - 1)
		$array[$i][0] = -1
		$array[$i][1] = 0
	Next
EndFunc   ;==>InitArray

Func FreeThread(ByRef $array)
	For $i = 1 To (UBound($array, 1) - 1)
		If $array[$i][0] = -1 Then
			Return $i
		EndIf
	Next
	Return SetError(1)
EndFunc   ;==>FreeThread

Func DelFile($x)
	If FileExists(@TempDir & "\Download_" & $x & ".dat") = 1 Then
		FileDelete(@TempDir & "\Download_" & $x & ".dat")
	EndIf
EndFunc   ;==>DelFile

Func WorkTime()
	$WorkSec = Round(TimerDiff($sBeginTime) / 1000)
	$sWorkTime = StringFormat("%02d:%02d:%02d", Int($WorkSec / 60 / 60), _
			Int(($WorkSec - Int($WorkSec / 60 / 60) * 3600) / 60), _
			Int($WorkSec - Int($WorkSec / 60 / 60) * 3600 - Int(($WorkSec - Int($WorkSec / 60 / 60) * 3600) / 60) * 60))
	Return $sWorkTime
EndFunc   ;==>WorkTime

Func Cleanup()
	For $i = 1 To (UBound($hDownload, 1) - 1)
		If $hDownload[$i][0] <> -1 Then
			InetClose($hDownload[$i][0])
		EndIf
		DelFile($i)
	Next
EndFunc   ;==>Cleanup

Func TogglePause()
	_GUICtrlStatusBar_SetText($StatusBar1, "-ПАУЗА- чтобы продолжить нажми клавишу <Pause/Break>", 1)
	$Paused = Not $Paused
	While $Paused
		Sleep(200)
	WEnd
	_GUICtrlStatusBar_SetText($StatusBar1, " ", 1)
EndFunc   ;==>TogglePause

Func Terminate()
	_GUICtrlStatusBar_SetText($StatusBar1, "-СТОП-", 1)
;~ 	ConsoleWrite("-СТОП-" & @CRLF)
	$Stop = 1
	Cleanup()
	$CountThread = 0
EndFunc   ;==>Terminate

тут еще нужно много чего доделать (например большой лог не выводится), но в силу ограничений АutoIT интерес пропал, пробую на С++.

PS Большое пожелание к разработчикам АutoIT - доделать многопоточность, или хотя бы сетевые функции реализовать через WinHTTP. Ведь несколько потоков в принципе запускаются только приводят к крешу, там что-то связанное с тем что код autoit не потокобезопасен, может это можно исправить?
 
Верх