[AutoIt]True Multithreading

07/28/2013 13:47 FacePalmMan#1
Wie der titel schon sagt möchte ich euch zeigen wie man in autoit multithreaded!
und zwar habe ich vor einiger zeit eine udf gefunden ,welche es mir erlaubt in autoit mehrere threads zu nutzen.
viele denken bestimmt ,dass es kein richtiges multithreading ist und das script durch funktionen wie msgbox und winwait(-active,-close,-notactive) trotzdem pausiert wird ,was aber nicht stimmt.
Hier mal ein kleines beispiel:
Code:
$Handle1 = DllCallbackRegister("ThreadTest1", "int", "ptr")
$Handle2 = DllCallbackRegister("ThreadTest2", "int", "ptr")
$Struct1 = DllStructCreate("Char[200];int")
DllStructSetData($Struct1, 1, 10)
CreateThread($Handle1, $Struct1)
$Struct2 = DllStructCreate("Char[200];int")
DllStructSetData($Struct2, 1, 10)
CreateThread($Handle2, $Struct2)
MsgBox(0x40, "Thread 1", "Default Thread")

Func CreateThread($Handle, $struct)
	$return = DllCall("kernel32.dll", "hwnd", "CreateThread", "ptr", 0, "dword", 0, "long", DllCallbackGetPtr($Handle), "ptr", DllStructGetPtr($struct), "long", 0, "int*", 0)
	Return $return[0]
EndFunc

Func ThreadTest1($x)
	MsgBox(0x40, "Thread 2", "Added Thread #1")
EndFunc ;==>_ThreadStart
Func ThreadTest2($y)
	MsgBox(0x40, "Thread 3", "Added Thread #2")
EndFunc ;==>_ThreadStart
Wie das funktioniert:
erst benutzt man die DllCallbackRegister funktion um die handle der aufzurufenden funktion rauszubekommen.
danach erstellt man mit DllStructCreate eine Struktur ,in welche man (nicht notwendiger weise) in das element 1 den wert 10 reinschreibt.
wenn man diese sachen gemacht hat ,kann man mit CreateThread die im DllCallbackRegister eingegebene funktion aufrufen lassen.
07/28/2013 15:46 BladeTiger12#2
Und wo sind die Credits?
Weil das Script dir auch nicht gehört.
Das ist ein c&p script.
07/28/2013 15:53 Fl00d3R#3
Außerdem ist das nicht Multithreading sondern Multiprocessing.
Schau im Taskmanager wenn du ein "CreateThread" an die Kernel32.dll schickst.
Außerdem nur mit 32bit und ohne upx verwenbar.
wenn du jetzt einen Hilfreichen Post hinterlassen willst, erkläre lieber wie die "Threads" untereinander Daten austauschen können, oder Variablen Global auf allen Threads verfügbar gemacht werden können.
Sonst bringt das ganze ja Null.

LG Fl00d3R
07/28/2013 17:07 FacePalmMan#4
Quote:
Originally Posted by BladeTiger12 View Post
Und wo sind die Credits?
Weil das Script dir auch nicht gehört.
Das ist ein c&p script.
Quote:
Originally Posted by FacePalmMan View Post
und zwar habe ich vor einiger zeit eine udf gefunden ,welche es mir erlaubt in autoit mehrere threads zu nutzen.
Quote:
Originally Posted by Fl00d3R View Post
Außerdem ist das nicht Multithreading sondern Multiprocessing.
Schau im Taskmanager wenn du ein "CreateThread" an die Kernel32.dll schickst.
Außerdem nur mit 32bit und ohne upx verwenbar.
wenn du jetzt einen Hilfreichen Post hinterlassen willst, erkläre lieber wie die "Threads" untereinander Daten austauschen können, oder Variablen Global auf allen Threads verfügbar gemacht werden können.
Sonst bringt das ganze ja Null.

LG Fl00d3R
bei mir kann ich alles auf allen threads benutzen. ob ich eine variable als local oder als global deklariere macht da keinen unterschied.
"Außerdem ist das nicht Multithreading sondern Multiprocessing." wenn ich keine extra-"threads" offen habe ,zeigt mir mein taskmanager 2 threads für Autoit.exe an. wenn ich aber threads öffne zeigt es mir mehr threads an.
07/28/2013 20:11 Shadow992#5
Quote:
Originally Posted by Fl00d3R View Post
Außerdem ist das nicht Multithreading sondern Multiprocessing.
Schau im Taskmanager wenn du ein "CreateThread" an die Kernel32.dll schickst.
Außerdem nur mit 32bit und ohne upx verwenbar.
wenn du jetzt einen Hilfreichen Post hinterlassen willst, erkläre lieber wie die "Threads" untereinander Daten austauschen können, oder Variablen Global auf allen Threads verfügbar gemacht werden können.
Sonst bringt das ganze ja Null.

LG Fl00d3R
Ich bin mir nicht sicher ob man nicht auch Variablrn normal benutzen kann, selbst wenn man es nicht kann, wären NamedPipes eine Lösung.

Und so wie das für mich aussieht ist das MultiThreading und nicht MultiProcessing.
Für MultiProcessing müsste man CreateProcess benutzen.
07/28/2013 23:07 lolkop#6
das ganze wurde hier schon sehr oft diskutiert... ein beinahe identischer code wurde zb [Only registered and activated users can see links. Click Here To Register...] vor ca 4 jahren schoneinmal gepostet...

leider ist das ganze sehr instabil und schwer überwachbar, was am ende für mehr probleme als nutzen sorgt...

wirklichen nutzen kann man meines erachtens hierraus keinen ziehen.
07/28/2013 23:43 Shadow992#7
Quote:
Originally Posted by lolkop View Post
das ganze wurde hier schon sehr oft diskutiert... ein beinahe identischer code wurde zb [Only registered and activated users can see links. Click Here To Register...] vor ca 4 jahren schoneinmal gepostet...

leider ist das ganze sehr instabil und schwer überwachbar, was am ende für mehr probleme als nutzen sorgt...

wirklichen nutzen kann man meines erachtens hierraus keinen ziehen.
Jop AutoIt wurde leider nie Thread-safe gemacht, daher ist Multithreading wohl ohne größere Änderungen am AutoIt-Interpret nicht möglich.
07/29/2013 21:43 FacePalmMan#8
stimmt. autoit wurde nicht für multithreading gemacht. ich hab da eine etwas bekloppte idee. und zwar:
was wenn wir autoit multithreadingfähig machen? gucken wie andere sprachen das mit dem multithreading machen , gucken was autoit fehlt um multithreaden zu können und anschließend diese einzelnen sachen zum script hinzufügen.
07/29/2013 23:43 Shadow992#9
Quote:
Originally Posted by FacePalmMan View Post
stimmt. autoit wurde nicht für multithreading gemacht. ich hab da eine etwas bekloppte idee. und zwar:
was wenn wir autoit multithreadingfähig machen? gucken wie andere sprachen das mit dem multithreading machen , gucken was autoit fehlt um multithreaden zu können und anschließend diese einzelnen sachen zum script hinzufügen.
Da hast du genau 2 Möglichkeiten das zu machen.
1. Irgendwie an den Source kommen, da AutoIt nicht mehr Open-Source ist.
2. Heftige Reverse Engineer-Analyse

Beides sehr schwer bzw. umständlich, wird also so schnell nichts.
Die einfachste Methode ist immer noch NamedPipes mit mehreren Proezssen zu nutzen.