Ich weiß es gibt schon Multithreading UDF('s), aber ich glaube die waren schwerer zu benutzen (aber dafür vielleicht besser).
Die Idee habe ich von einem Beitrag von ProgAndy, den ich nicht mehr wiederfinde
Aber ich habe noch sein Script:
Spoiler anzeigen
$handle = DllCallbackRegister("_Threadstart","int","ptr")
; Struct to send to the Thread
$dll = DllStructCreate("Char[200];int")
DllStructSetData($dll,1,"hi")
DllStructSetData($dll,2,1234)
$ret = DllCall("kernel32.dll","hwnd","CreateThread","ptr",0,"dword",0,"long",DllCallbackGetPtr($handle),"ptr",DllStructGetPtr($dll),"long",0,"int*",0)
MsgBox(0, "Thread-Info", "Handle: " & $ret[0] & @CRLF & "Thread-ID: " & $ret[6])
Func _ThreadStart($x)
$y = DllStructCreate("char[200];int",$x)
MsgBox(0, "Thread 1", DllStructGetData($y,1) & @CRLF & DllStructGetData($y,2)&@CRLF &"AutoIt can Multithreading !!!")
EndFunc
So darauf habe ich jetzt eine UDF gemacht, nicht groß oder sondervoll wenn man das Script gesehen hat, aber ich denke trotzdem nützlich
Script
;Beispiel:
Global $th=_ThreadCreate("_TS","char[2];int","hi;1")
;~ _ThreadClose($th);*
MsgBox(0,"","")
Func _TS($x)
Sleep(10) ;Damit $th schon zugewiesen ist, wenn die Daten ausgelesen werden
;~ Sleep(1000);*
Local $y=_ThreadDataRead($x,$th[2]) ;Die Daten könnte man natürlich auch manuel auslesen
if IsArray($y) Then
MsgBox(0,$y[0],$y[1])
Else
MsgBox(0,"NoData","Tja, Pech gehabt!")
EndIf
EndFunc
;* Beispiel für Threadclose, wenn nur eine Msgbox angezeigt wird, hat es gekklappt
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit];UDF:
Func _ThreadCreate($func,$globalstruct="",$zuweisungen="") ;$func must have one Parameter, Data can be read with _ThreadDataRead
Local $threadinfo[3],$ptr
If $globalstruct="" Then
$ptr=0
Else
$struct=DllStructCreate($globalstruct)
If $zuweisungen<>"" Then
Local $split=StringSplit($zuweisungen,";")
If @error Then
Local $split[2]
$split[0]=1
$split[1]=$zuweisungen
EndIf
For $x=1 To $split[0]
DllStructSetData($struct,$x,$split[$x])
Next
EndIf
$ptr=DllStructGetPtr($struct)
EndIf
Local $cbr=DllCallbackRegister($func,"int","ptr")
Local $ret=DllCall("kernel32.dll","hwnd","CreateThread","ptr",0,"dword",0,"long",DllCallbackGetPtr($cbr),"ptr",$ptr,"long",0,"int*",0)
If Not IsArray($ret) Or @error Then Return SetError(@error,@extended,0)
$threadinfo[0]=$ret[0];Handle
$threadinfo[1]=$ret[6];Thread-ID
$threadinfo[2]=$globalstruct;information struct
Return $threadinfo
EndFunc
Func _ThreadDataRead($param,$tgis);Returns Data in Array
If $tgis="" Then Return 0
$struct=DllStructCreate($tgis,$param)
Local $split=StringSplit($tgis,";")
If @error Then
Local $split[2]
$split[0]=1
EndIf
Local $ret[$split[0]]
For $x=1 To $split[0]
$ret[$x-1]=DllStructGetData($struct,$x)
Next
Return $ret
EndFunc
Func _ThreadClose(ByRef $threadinfo,$exitcode=0)
If Not IsArray($threadinfo) Then Return SetError(1,0,-1)
DllCall("kernel32.dll","bool","TerminateThread","handle",$threadinfo[0],"dword",$exitcode)
DllCall("kernel32.dll","int","CloseHandle","handle",$threadinfo[0])
EndFunc
So und jetzt setze ich mich warscheinlich wieder an etwas anderes
PS:
Weiß jemand ob ein Thread die Ausführung aufteilt (also nicht insgesamt schneller ist) oder kann man sie gebrauchen um ein Script schneller zu machen?
EDIT:
Ich weiß nicht warum, aber irgendwie kommen nach Phasen Fehler und dann wieder nicht, obwohl es das gleiche Script ist