Hi,
Ich habe vor eine Multitask UDF zuschreiben mit der es möglich ist mehrere Tasks auf einmal(dann hallt über unterschiedliche Scripte ;)) auszuführen.
Zum verstehen des Tasks Systems:
Du hasst in einem Script eine Schleife welche sagen wir mal veränderungen am Gui(klicke auf bottoms etc.) wahrnimmt und möchtest noch zusätzlich eine die feststellt, ob jemand auf dem Tcpserver des Scriptes connected hat. Nun könnte man es beides in eine Schleife packen aber da gibt es das Problem dass es bei seeeeehr langen scripts dann dauert bis der Gui reagiert.
Mein Plan:
In einem 2. Script kann man eine Endlosschleife aufstellen die versucht aus dem Gui des ersten Scriptes die Daten zu entlocken während dieser sich um den Server kümmert.
Meine Lösung:
bis jetzt nur 6 Funktionen:
Spoiler anzeigen
#include-once
#include <array.au3>
#include <file.au3>
Tcpstartup()
Global $count=0,$Connect[99],$Accept[99],$Split[99]
Tcpstartup()
Func _MultitaskStartServer($CP=1,$Max_Tasks=99,$Multi_Server_Port=10234)
Global $listen=TCPListen("127.0.0.1",$Multi_Server_Port)
$Multitasks="notaktive"
If $CP=1 Then
GUICreate("Multitask Control Pannel",250,200)
Global $Input=GUICtrlCreateInput("",1,170,200,29)
$Start_Func=GUICtrlCreateButton("StartFunc",200,170,50,29)
Guisetstate()
EndIf
_MultitaskServerBasicStartup()
While 1
$msg=GUIGetMsg()
Switch $msg
case -3
_MultitaskConnectionsShutdown()
Exit
case $Start_Func
_MultitaskServerFunctionList(GUICtrlRead($Input),$listen)
$Multitasks="aktive"
EndSwitch
If $Multitasks="aktive" then
For $counter=0 to $count -1
$recv=Tcprecv($Connect[$counter],999)
If $recv <>"" then MsgBox(0,"",$recv)
Next
EndIf
WEnd
EndFunc
Func _MultitaskServerFunctionList($data,$listen)
$Split=StringSplit($data," ")
If $split[0]=1 then _ArrayAdd($Split,"")
$count=$count+1
Random(10000,15000,1)
If $Split[1] = "_RunMultitask" Then
_RunMultitask()
GUICtrlSetData($Input,"")
EndIf
If $Split[1]="_MultitaskConnectionsShutdown" Then
_MultitaskConnectionsShutdown()
GUICtrlSetData($Input,"")
EndIf
If $Split[1]="_MultitaskConnectionsRestart" Then
_MultitaskConnectionsRestart()
GUICtrlSetData($Input,"")
EndIf
If $Split[1]="_MultitaskDeleteAlldatabases" Then
_MultitaskDeleteAlldatabases()
GUICtrlSetData($Input,"")
EndIf
If $Split[1]="_MultitaskRewriteServerfiles" Then
_MultitaskRewriteServerfiles($Split[2],$Split[3])
GUICtrlSetData($Input,"")
EndIf
EndFunc
Func _MultitaskServerBasicStartup($Path="MultitaskServer.ini")
$diary=_FileListToArray(@ScriptDir,"*",2)
If IsArray($diary) Then
For $Counter=1 to Ubound($diary)-1
$Port=IniRead($Path,"Ports",$diary[$Counter],"")
If $Port<>"" Then
Run($diary[$Counter]&"\"&$Port&".exe")
$count=$count+1
Do
$Connect[$count]=TCPConnect("127.0.0.1",$Port)
Until $Connect[$count]<>-1
Do
$Accept[$count]=Tcpaccept($listen)
Until $Accept[$count]<>-1
EndIf
Next
EndIf
EndFunc
Func _MultitaskConnectionsRestart()
_MultitaskConnectionsShutdown()
Global $count=0
;TCPStartup()
Sleep(2000)
_MultitaskServerBasicStartup()
EndFunc
Func _MultitaskConnectionsShutdown()
For $Counter=1 to $count+2
Tcpsend($Connect[$Counter],"Exit")
Sleep(100)
Next
;TCPShutdown()
EndFunc
Func _RunMultitask()
If $Split[2]="" Then
$diary=_FileListToArray(@ScriptDir,"*",2)
$Split[2]="NR"&Ubound($diary)
EndIf
Global $to=$Split[2]
$Port=Random(10000,15000,1)
$path=$to&"/"&$Port
DirCreate($to)
FileWriteLine($Path&".au3","#include<Multitask.au3>")
FileWriteLine($Path&".au3","#include<Array.au3>")
FileWriteLine($Path&".au3",'Tcpstartup()')
Filewriteline($Path&".au3",'$Port='&$Port)
FileWriteLine($Path&".au3",'$listen=Tcplisten("127.0.0.1",$Port)')
FileWriteLine($Path&".au3",'While 1')
Filewriteline($Path&".au3",'$accept=Tcpaccept($listen)')
FileWriteLine($Path&".au3",'If $accept<>-1 then Exitloop')
FileWriteLine($Path&".au3",'Wend')
Filewriteline($Path&".au3",'While 1')
Filewriteline($Path&".au3",'$connect=Tcpconnect("127.0.0.1",10234)')
FileWriteLine($Path&".au3",'If $connect<>-1 then ExitLoop')
FileWriteLine($Path&".au3",'Wend')
Filewriteline($Path&".au3",'While 1')
Filewriteline($Path&".au3",'$recv=TCPRecv($accept,2048)')
Filewriteline($Path&".au3",'If $recv="Exit" then Exit')
Filewriteline($Path&".au3",'If $recv<>"" then')
Filewriteline($Path&".au3",'$split=StringSplit($recv,"|")')
Filewriteline($Path&".au3",'_ArrayDisplay($split)')
Filewriteline($Path&".au3",'For $Linecounter=0 To Ubound($split)-1')
Filewriteline($Path&".au3",'Execute($split[$Linecounter])')
Filewriteline($Path&".au3",'Next')
Filewriteline($Path&".au3",'Endif')
Filewriteline($Path&".au3",'Wend')
RunWait('"D:\Program Files\AutoIt3\Aut2Exe\Aut2exe.exe" "/in" '&$Path&".au3")
Run($to&"/"&$Port&".exe")
IniWrite("MultitaskServer.ini","Ports",$to,$Port)
Do
$Connect[$count]=TCPConnect("127.0.0.1",$Port)
Until $Connect[$count]<>-1
Do
$Accept[$count]=Tcpaccept($listen)
Until $Accept[$count]<>-1
EndFunc
Func _MultitaskDeleteAlldatabases()
_MultitaskConnectionsShutdown()
$diary=_FileListToArray(@ScriptDir,"*",2)
If IsArray($diary) Then
For $Counter=1 to $diary[0]
DirRemove(@ScriptDir & "\" &$diary[$Counter],1)
Next
FileDelete("MultitaskServer.ini")
EndIf
EndFunc
Func _MultitaskRewriteServerfiles($Name,$Port)
$Gui_Rewrite=GUICreate("Rewrite Config Files",800,600)
$Edit_Rewrite=GUICtrlCreateEdit(FileRead($name&"\"&$Port&".au3"),1,1,799,550)
$Bottom_Rewrite=GUICtrlCreateButton("Save",1,550,300,49)
Guisetstate()
While 1
$msg=Guigetmsg($Gui_Rewrite)
Switch $msg
Case -3
Exit
case $Bottom_Rewrite
FileDelete($name&"\"&$Port&".au3")
FileDelete($name&"\"&$Port&".exe")
FileWrite($name&"\"&$Port&".au3",Guictrlread($Edit_Rewrite))
RunWait('"D:\Program Files\AutoIt3\Aut2Exe\Aut2exe.exe" "/in" '&$name&"\"&$Port&".au3")
EndSwitch
WEnd
EndFunc
Func _MultitaskStartServer($CP=1,$Max_Tasks=99,$Multi_Server_Port=10234)
$listen=TCPListen("127.0.0.1",$Multi_Server_Port)
$Multitasks="notaktive"
If $CP=1 Then
GUICreate("Multitask Control Pannel",250,200)
$Input=GUICtrlCreateInput("",1,170,200,29)
$Start_Func=GUICtrlCreateButton("StartFunc",200,170,50,29)
Guisetstate()
EndIf
While 1
$msg=GUIGetMsg()
Switch $msg
case -3
Exit
case $Start_Func
_MultitaskServerFunctionList(GUICtrlRead($Input),$listen)
$Multitasks="aktive"
EndSwitch
If $Multitasks="aktive" then
For $counter=0 to $count -1
$recv=Tcprecv($Connect[$counter],999)
If $recv <>"" then MsgBox(0,"",$recv)
Next
EndIf
WEnd
EndFunc
Func _MultitaskServerFunctionList($data,$listen)
$Split=StringSplit($data," ")
$count=$count+1
Random(10000,15000,1)
If $Split[1] = "_RunMultitask" Then
$to=$Split[2]
$Port=Random(10000,15000,1)
FileWriteLine($to&".au3","#include<Multitask.au3>")
FileWriteLine($to&".au3","#include<Array.au3>")
FileWriteLine($to&".au3",'Tcpstartup()')
Filewriteline($to&".au3",'$Port='&$Port)
FileWriteLine($to&".au3",'$listen=Tcplisten("127.0.0.1",$Port)')
FileWriteLine($to&".au3",'While 1')
Filewriteline($to&".au3",'$accept=Tcpaccept($listen)')
FileWriteLine($to&".au3",'If $accept<>-1 then Exitloop')
FileWriteLine($to&".au3",'Wend')
Filewriteline($to&".au3",'While 1')
Filewriteline($to&".au3",'$connect=Tcpconnect("127.0.0.1",10234)')
FileWriteLine($to&".au3",'If $connect<>-1 then ExitLoop')
FileWriteLine($to&".au3",'Wend')
Filewriteline($to&".au3",'While 1')
Filewriteline($to&".au3",'$recv=TCPRecv($accept,2048)')
Filewriteline($to&".au3",'If $recv<>"" then')
Filewriteline($to&".au3",'$split=StringSplit($recv,"|")')
Filewriteline($to&".au3",'_ArrayDisplay($split)')
Filewriteline($to&".au3",'For $Linecounter=0 To Ubound($split)-1')
Filewriteline($to&".au3",'Execute($split[$Linecounter])')
Filewriteline($to&".au3",'Next')
Filewriteline($to&".au3",'Endif')
Filewriteline($to&".au3",'Wend')
RunWait('"D:\Program Files\AutoIt3\Aut2Exe\Aut2exe.exe" "/in" '&$to&".au3")
Run($to&".exe")
Do
$Connect[$count]=TCPConnect("127.0.0.1",$Port)
Until $Connect[$count]<>-1
Do
$Accept[$count]=Tcpaccept($listen)
Until $Accept[$count]<>-1
EndIf
EndFunc
Func _Multitask_Create($Number=1,$mode=1)
Local $listen,$recv,$array[99]
TCPStartup()
$listen=TCPListen("127.0.0.1",0000&$Number)
While 1
$Tcpaccept=TCPAccept($listen)
If $Tcpaccept<>-1 then ExitLoop
WEnd
While 1
$recv=TCPRecv($Tcpaccept,99999)
If $recv<>"" Then
$array=StringSplit($recv,"|")
If $mode=1 Then
For $counter in $array
Execute($counter)
Next
EndIf
If $mode=2 Then
While 1
For $counter in $array
$Tcpaccept=TCPAccept($listen)
If Tcprecv($Tcpaccept,99999)="Multitask_Stop_per_Funtion" then Exit
Execute($counter)
Next
WEnd
EndIf
EndIf
WEnd
EndFunc
Func _ExecuteFromFile($Path,$mode=1)
Local $array[999]
For $Linecounter=0 To _FileCountLines($Path)
$array[$Linecounter]=FileReadline($path,$Linecounter)
Next
If $mode=1 Then
For $Linecounter=0 To _FileCountLines($Path)
Execute($array[$Linecounter])
Next
EndIf
if $mode=2 Then
While 1
For $Linecounter=0 To _FileCountLines($Path)
Execute($array[$Linecounter])
Next
Wend
EndIf
EndFunc
Func _Multitask_Send($msg,$Number=1)
Tcpstartup()
Local $connect=TCPConnect("127.0.0.1",0000&$Number)
Sleep(2000)
TCPSend($Connect,$msg)
EndFunc
Func _Multitask_Stop($Number=1)
$connect=TCPConnect("127.0.0.1",0000&$Number)
TCPSend($connect,"Multitask_Stop_per_Funtion")
EndFunc
Func _Multitask_CreateSingleTask($Function,$mode=2,$used4_Multiclient=0,$to="")
If $to="" then $to=Random(1,10000,1)
Local $Split=StringSplit($Function,"|")
If $used4_Multiclient=1 then FileWriteLine($to&".au3","#include<Multitask.au3>")
If $mode=1 then FileWriteLine($to&".au3","While 1")
For $Linecounter=1 To UBound($Split) -1
FileWriteLine($to&".au3",$Split[$Linecounter])
$Split[$Linecounter]=FileReadline($to,$Linecounter)
Next
If $mode=1 then FileWriteLine($to&".au3","Wend")
RunWait('"D:\Program Files\AutoIt3\Aut2Exe\Aut2exe.exe" "/in" '&$to&".au3")
FileDelete($to&".au3")
Run($to&".exe")
Return $to
EndFunc
Func _Multitask_DeleteSingleTask($to)
ProcessClose($to&".exe")
FileDelete($to&".exe")
EndFunc
Func _Multitask_SendReply($x,$y,$reply,$Server)
If $x=$y then TCPSend($server,$reply)
EndFunc
Funktion 1:
_Multitask_Create($Number,$mode)
$Number entspricht dem Multitask index oder dann auch dem Port den der Script für den Datenaustausch belegt.
$mode gibt an ob die vom Start-Script gesendete Funktion nur einmal($mode=1) oder auch mehrfach($mode=2) ausgeführt werden soll.
-->Führt eine oder Mehrere Funktionen die durch _Multitask_Send gesendet werden einmal oder fortlaufend aus.
Funktion 2:
Func _ExecuteFromFile($Path,$mode)
$Path=Datei Path des "Source Codes"
$mode=Gibt an wie oft der "Source Code" ausgeführt werden soll ob 1mal($mode=1) oder fortlaufen ($mode=2)
-->Führt Sämmliche Funktionen die in einem Dokument abgelegt sind nacheinander aus.
Bsp für ein Textdokument:
Spoiler anzeigen
$davor=3-1
$jetzt=$davor+1
Msgbox(0,$davor,$jetzt)
Code um es in Autoit fortlaufend auszuführen:
_ExecutefromFile("test.txt",2)
Was Passiert?
Eine Msgbox mit dem Titel 2 und dem Text 3 erscheint immerwieder auf dem Bildschirm.
Funktion 3:
_Multitask_Send($msg,$Number)
$msg=Funktionen die ausgeführt werden sollen, z.B. 'Msgbox(0,"","")|Msgbox(0,"","Hallo")'
Info: Trennzeichen ist--> | und vor und nach den Funktionen muss ein --> ' stehen
$Number=Die Multitask Nummer an die die Befehle gesendet werden sollen.
-->Sendet eine Funktionsreihe welche dann von _Multitask_Create in einem anderen script ausgeführt werden.
Funktion 4:
_Multitask_Stop($Number)
$Number=Multitask Nummer.
-->bricht die Schleife in _Multitask_Create ab falls $mode auf 2 gesetzt wurde.
Funktion 5:
_Multitask_CreateSingleTask($Function,$mode,$to)
$Function=Die Funktionskette die ausgeführt werden soll. Aufbau: z.b. 'Tooltip("Das ist ein Tooltip",50,50)|Sleep(5000)'
$mode= wenn mode 1 wird die Funktionskette fortlaufend fortausgeführt. standart ist eine einmalige Ausführung.
$to=Zwischenpfad, in dem dei Source und danach der zu ausführende .exe task liegt. Standart Pfad ist eine zufälige Zahl von 1 und 10000 mit daramgehängten.exe/.au3 .
-->Schreibt einen Source Code in eine .au3 Datei, Compilet ihn und startet ihn.
Info: Zeile 73: RunWait('"D:\Program Files\AutoIt3\Aut2Exe\Aut2exe.exe" "/in" '&$to&".au3")
Hier muss euer eigener Pfad zur Aut2exe.exe sein! die Aut2exe.exe Compiliert normalerweise eure Scripte.
Rückgabewert ist der Ort+Dateiname in der dann die .exe gespeicht werden. Das wird gebraucht für:
Funktion 6
_Multitask_DeleteSingleTask($to)
$to=Pfad von _CreateSingleTask zurückgegeben.
Macht nichtsweiter als die erstellte Singletask.exe wieder zu löschen.
Function 7 aufwärts:
Ich schreibe morgen die Beschreibung!
Die Funktionen haben sich nun viel mehr meinen eigenen Bedürfnisen angepasst.
Startet ein Script mit:
#include<Multitask.au3>
_MultitaskStartServer()
Die Funktionen für den Control Pannel findet ihr in der _MultitaskServerFunctionList()
Der Pannel übernimmt jede Arbeit von alleine.
Neuen Server starten z.b.: _RunMultitask Servername
So
Es wird bei mir denke noch sehr viel kommen bis jetzt ca. 3 Stunden Arbeit.
Bis jetzt kann man nur eine Funktionskette von einem anderem Script ausführen lassen. Manchmal kann es denke jetzt schon praktisch sein. Die _Executefromfile Funktion finde ich persönlich sehr nützlich
wünscht mir Glück dass es was ordentliches wird :>
Ist als 14jähriger meine erste UDF also bitte nicht wundern falls viele Rechtschreibfehler/zulange formulierungen auftreten :>
Changelog:
>7.November:Projektstart
>8.November: _MultitaskCreateSingleTask und _MultitaskDeleteSingleTask hinzugefhügt
>11. November: Großes Update Part 1/2 , ist nochnicht fertig aber ich wollte es schonmal online stellen.
Todo:
>Kommunikation zwischen den Schritten
>Aufräumen des Scriptes
Info: Script ist noch sehr unordentlich. Die FunktiosnParameter werden vorest durch Globale Variablen vergeben die sich (noch) teils überschneiten. Ich verbringen atm die meiste Zeit die mir zur verfügung steht mit dem Script. Morgen komen updates+Korrekturen.
Mfg Bastian(Bloodykill) aka Sevenby7