firex
AutoIT Гуру
- Сообщения
- 943
- Репутация
- 208
AutoIt: 3.3.8.1+
Версия: Concept
Категория: Вспомогательные функции, Процессы, Разное
Описание: Эта библиотека реализует возможность создания некого подобия потокам ( выполнение функций без остановки основного кода ). Скрипт дублирует себя и передает определенную информацию ( блокируя выполнение основного кода ), с помощью этой информации создается коммуникация между родительским процессом и "потоком" через память родителя.
Особенности:
Список функций:
Пример:
Файл: AutThread.au3
Источник: autoit-script.ru
Автор(ы): Firex
Версия: Concept
Категория: Вспомогательные функции, Процессы, Разное
Описание: Эта библиотека реализует возможность создания некого подобия потокам ( выполнение функций без остановки основного кода ). Скрипт дублирует себя и передает определенную информацию ( блокируя выполнение основного кода ), с помощью этой информации создается коммуникация между родительским процессом и "потоком" через память родителя.
Особенности:
1) В случае падения родителя, поток закроется автоматически ( двухстороннее слежение ).
2) После выполнения целевой функции поток вернет все результаты в родителя ( @Error, @Extended, Return value ).
3) Автоматическое восстановление значения исходя из его типа ( как и при передаче аргументов, так и при возврате значения Return ).
4) Максимальный буфер с аргументами/возвращаемым значением не должен превышать byte[4] ( dword ).
5) В случае, если ответ превышает размеры заданного вами буфера - он будет обрезан.
6) На данный момент передача массива не возможна, вместо него придет пустая строка.
2) После выполнения целевой функции поток вернет все результаты в родителя ( @Error, @Extended, Return value ).
3) Автоматическое восстановление значения исходя из его типа ( как и при передаче аргументов, так и при возврате значения Return ).
4) Максимальный буфер с аргументами/возвращаемым значением не должен превышать byte[4] ( dword ).
5) В случае, если ответ превышает размеры заданного вами буфера - он будет обрезан.
6) На данный момент передача массива не возможна, вместо него придет пустая строка.
Список функций:
Код:
; #CURRENT#
;_AutThread_Create
;_AutThread_Kill
;_AutThread_IsAlive
;_AutThread_ParentThreadPID
;_AutThread_SelfIsThread
;_AutThread_ErrorCallbackRegister
; #INTERNAL_USE_ONLY#
;__AT_Init
;__AT_Main
;__AT_VarType
;__AT_ReinterpretCast
;__AT_TagSize
;__AT_OpenProcess
;__AT_ReadProcessMemory
;__AT_WriteProcessMemory
;__AT_CloseHandle
;__AT_OnExit
Пример:
Обязательно скомпилировать.
Код:
#Include <GUIEdit.au3>
#Include <StaticConstants.au3>
#Include <WindowsConstants.au3>
#Include "AutThread.au3"
Func _MsgBox( $iFlag = 0, $sTitle = "", $sText = "", $iTimeout = 0, $hWnd = 0 )
Local $iRet = MsgBox( $iFlag, $sTitle, $sText, $iTimeout,$hWnd )
If $iRet = -1 Then _
SetError( Random( 1, 5, 1 ), Random( 5, 12, 1 ) )
Return $iRet
EndFunc
Local $hGui, $aInput[6], $iButtonCreate, $iLog
$hGui = GUICreate( "Thread_Example1", 375, 240, -1, -1 )
Local $t = GUISetFont( 9 ), $m = GUISetState( @SW_SHOW, $hGui )
GUICtrlCreateLabel( "Message box in Thread!", 5, 10, 355, 20, $SS_CENTER )
GUICtrlSetFont( -1, 11 )
GUICtrlCreateLabel( "MsgBox("&@TAB&" ,"&@TAB&@TAB&","&@TAB&@TAB&","&@TAB&","&@TAB&@TAB&")", 5, 40, 365, 20 )
GUICtrlSetState( -1, 128 )
$aInput[1] = GUICtrlCreateInput( 64, 54, 39, 35, 20 )
$aInput[2] = GUICtrlCreateInput( "Title...", 97, 39, 65, 20 )
$aInput[3] = GUICtrlCreateInput( "Text...", 170, 39, 73, 20 )
$aInput[4] = GUICtrlCreateInput( 0, 251, 39, 32, 20 )
$aInput[5] = GUICtrlCreateInput( 0, 291, 39, 72, 20 )
$iButtonCreate = GUICtrlCreateButton( ">Create (MsgBox) thread<", 5, 65, 365, 30 )
$iLog = GUICtrlCreateEdit( "", 5, 100, 365, 135, 0x50200844 )
; ===
Local $Idx = 0, $aArgs[6] = [5], $iEval
_AutThread_ErrorCallbackRegister( "__OnError" )
While Sleep( 40 )
Switch GUIGetMsg()
Case -3
Exit
Case $iButtonCreate
For $i = 1 To 5 Step 1
$aArgs[$i] = GUICtrlRead( $aInput[$i] )
Next
_AutThread_Create( "_MsgBox", 2, "iResult" & $Idx, $aArgs )
_GUICtrlEdit_AppendText( $iLog, "Thread #" & $Idx & " Created!" & @CRLF )
$Idx += 1
EndSwitch
For $i = $Idx To 0 Step -1
If IsDeclared( "iResult" & $i ) Then
$iEval = Eval( "iResult" & $i )
If $iEval Then
_GUICtrlEdit_AppendText( $iLog, "Thread #" & $i & " Return=" & $iEval & @CRLF & _
@TAB & "@Error=" & Eval( "iResult" & $i & "_err" ) & @CRLF & _
@TAB & "@Extended=" & Eval( "iResult" & $i & "_ext" ) & @CRLF )
Assign( "iResult" & $i, 0 )
EndIf
EndIf
Next
WEnd
Func __OnError( $iAutThread )
_GUICtrlEdit_AppendText( $iLog, "Thread #" & $iAutThread & " Crashed!" & @CRLF )
EndFunc
Файл: AutThread.au3
Источник: autoit-script.ru
Автор(ы): Firex