Seite 1 von 2
wie kann ich einen Thread testen
Verfasst: 18.10.2004 21:12
von Graffiti
wie kann ich einen Thread testen ob das Teil auch im Hintergrund läuft.
Ich habe es schon mit einem Delay in der Prozedur versucht und
mit einer Megaschleife.
Mein Programm stand dann still für den Zeitraum in der die Proze. ausgeführt wurde
oder liege ich da jetzt irgendwie falsch
Gruß Graffiti
Verfasst: 19.10.2004 15:36
von Justy
Hast du CreateThread(@Procedure,...) benutzt?
Wenn ja, dürfte normal nichts stehenbleiben!
Also:
Code: Alles auswählen
Procedure test()
For i = 0 To 100000
Delay(100)
Next
EndProcedure
CreateThread(@test(),"")
Verfasst: 19.10.2004 16:03
von glubschi90
Öhm... wenn ich Dich jetzt nicht falsch verstehe, dann würde ich's mal mit Debug versuchen...
Code: Alles auswählen
Procedure test()
For i = 0 To 100000
Delay(100)
Debug "Test"
Next
EndProcedure
CreateThread(@test(),"")
Verfasst: 19.10.2004 17:35
von Falko
Alleine funst das nicht. Hab das noch als passendes Beispiel erweitert und das läuft parallel.
Code: Alles auswählen
Procedure test()
For i = 0 To 100000
Delay(100)
Debug "Test"+Str(i)
Next
EndProcedure
CreateThread(@test(),"")
If OpenWindow(0,0,0,305,140,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"ScrollAreaGadget") And CreateGadgetList(WindowID(0))
ScrollAreaGadget(0, 10, 10,290,120, 375, 155, 30)
ButtonGadget (1, 10, 10,230, 30,"Button 1")
ButtonGadget (2, 50, 50,230, 30,"Button 2")
ButtonGadget (3, 90, 90,230, 30,"Button 3")
TextGadget (4,130,130,230, 20,"This is the content of a ScrollAreaGadget!",#PB_Text_Right)
CloseGadgetList()
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
End
Case #PB_Event_Gadget
Select EventGadgetID()
Case 1
MessageRequester("Info","Button 1 was pressed!",#PB_MessageRequester_Ok)
Case 2
MessageRequester("Info","Button 2 was pressed!",#PB_MessageRequester_Ok)
Case 3
MessageRequester("Info","Button 3 was pressed!",#PB_MessageRequester_Ok)
EndSelect
EndSelect
ForEver
EndIf
Verfasst: 19.10.2004 19:01
von Graffiti
Ich glaube ich habs kappiert,
sobald man CreateThread(@test(),"") aufruft läuft der Prozess bereits. Besser ist
Ich muß also nicht extra noch test() aufrufen denn da starte ich nur die Prozedur und keinen Thread.
vor dem Neustart des Threads erst Killthread(test) sonst wird er nicht nur einmal sondern mehrmals ausgeführt.
GANZ WICHTIG immer eine ID vergeben das er sich auch wieder killen läßt, bei einer Endlosschleife
ansonsten endet er mit dem Prozess.
Danke Falco, dein Beispiel hat mich beleuchtet
jetzt weiß ich auch warum die Threads mit Vorsicht zu genießen sind. habs getestet indem ich Ihn immer wieder aufgerufen habe, das gibt eine Wahnsinnsschleife.
kann ich jetzt auch Rückgabewerte oder auf Daten vom Thread zugreifen
habe in der PB-Hilfe gelesen das es nicht geht, oder doch
wenn ich mehrere Werte übergeben möchte wie mache ich das,
habe beim testen immer Fehler vom Compiler bekommen
gruß Graffiti
Verfasst: 19.10.2004 19:30
von Falko
@Graffiti
Danach habe ich auch schon gesucht

Leider sieht das so aus, als ob man dem Thread nur eine Variable übergeben, aber nicht auslesen kann. Mit Memory-Befehl hab ich's auch probiert, aber irgendwie ist die aktuelle Speichervariable nicht für Thread und Hauptprogramm das selbe. Hab leider bis jetzt noch keine passende Lösung gefunden. Vielleich hat Danilo noch einen so wertvollen Tip auf Lager
Gruß Falko
Verfasst: 19.10.2004 19:41
von Graffiti
Ich habe gerade versucht an eine im Programm deklarierte DLL was zu übergeben haut auch nicht so hin.
Wie kann eine DLL für gemeinsamen Zugriff unter PB geöffnet werden, dann könnte ich das vielleicht in den Thread mit einbinden.
die DLL ist für den RS232 kann also zum Funktionieren nur einmal geöffnet werden mit OpenLibrary
Verfasst: 19.10.2004 20:19
von Falko
Ich hoffe ich sage hier jetzt nichts falsches. Eine DLL kann nur von einem Programm geöffnet und die internen Proceduren dann ausgeführt werden, solange sie geöffnet bleibt. Ich würde es mal so probieren:
So könnte man alles in einem Thread packen was in Echtzeit laufen sollte. Im Hauptprogramm würde man dann die grafische Oberfläche Menüs etc. mit denen man dann die Parameter für eine Parameterdatei
erstellen und speichern kann. Beim Start des Threads, würde man dann vorher die Parameterdatei nochmal für den Thread kopieren, die dann durch den Thread eingelesen und dann ausgeführt wird z.B. Mp3 abspielen und die RS232-Proceduren für die jeweiligen Funktionen ausführen lassen. So würde der Thread seine Arbeit ungestört im Hintergrund abarbeiten können. Die Anzeige der aktuellen Schalter und LED's ließen sich dort dann auch schön anzeigen.
Im Hauptprogramm selber könntest du weiterhin Parameteränderungen machen und jederzeit den Thread beenden, pausieren und neustarten mit aktualisierten Parametern (deshalb auch die Kopie). Die Variable die man dem Thread übergeben kann, könnte man dann auch als String (vermute ich mal) übergeben. Diese könnte der Name einer anderen Parameterdatei sein oder auch anderes.
Gruß Falko
Verfasst: 19.10.2004 23:49
von Falko
Habe schon mal eine Lösung wie man nach Buttonklick die aktuelle
Zählvariable aus dem Thread doch per Mem-Befehl ermitteln kann.
Jetzt müßte man nur noch die Abfrage automatisch per Buttonklick erzeugen. Direkt in der Repeat-Schleife per windowsevent(), geht leider noch nicht richtig

(mache morgen weiter, gute Nacht)
MfG Falko
Code: Alles auswählen
;Aktuellen Zähler aus dem aktiven Thread ermitteln
;Falko
Global *MemoryID
Procedure test(*MemoryID)
For i = 0 To 100000
Delay(100)
Debug "Test"+Str(i)
String.s="Test"+Str(i)
PokeS(*MemoryID,String)
Next
EndProcedure
*MemoryID = AllocateMemory(1000)
ID=CreateThread(@test(),"EIP")
If OpenWindow(0,0,0,305,140,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"ScrollAreaGadget") And CreateGadgetList(WindowID(0))
ScrollAreaGadget(0, 10, 10,290,120, 375, 155, 30)
ButtonGadget (1, 10, 10,230, 30,"Button 1")
StringGadget (2,60,60,230, 20,"Test: ")
CloseGadgetList()
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
End
Case #PB_Event_Gadget
Select EventGadgetID()
Case 1
; gibt mir den Zählwert aus dem Thread zurück
SetGadgetText(2,PeekS(*MemoryID))
EndSelect
EndSelect
ForEver
EndIf
Verfasst: 20.10.2004 20:40
von Justy
Hi!
Um mehrere Parameter zu übergeben, kannst du im Moment z.b. alles in einen String schreiben und mit chr(10) oder so trennen!
Das lässt sich ganz einfach mit dem StringField-Befehl machen!
Strings sind in Threads zwar angeblich problematisch (ka warum, hab noch nie Probleme gehabt), aber mir fällt auf die Schnelle keine bessere Methode ein.
Ich hoffe allerdings, dass man in PB4 dann auch mehrere Parameter an einen Thread übergeben kann!
mfg. Justy