Seite 1 von 2
Stop Thread
Verfasst: 26.04.2022 12:18
von interfind
Hallo,
ich habe folgendes Problem.
In meiner Event Schleife habe ich das Flag state=0.
Hiermit sollen meine laufenden Threads beendet werden.
Wenn ich aber jetzt mit WaitThread und IsThread das ganze überprüfe
laufen die Threads weiter bis meine Event-Schleife beendet ist.
Mach ich nach den state=0 noch einen Requester auf,
dann funtkioniert es aber korrekt.
Was mache ich hier falsch?
Code: Alles auswählen
Select WaitWindowEvent(0)
Case #PB_Event_CloseWindow
If MessageRequester ("","Programm beenden?", #PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes
state=0
;MessageRequester ("OK","Programm beendet")
For th=1 To CPU_Cores
If IsThread(mythread(th)): Debug WaitThread(mythread(th), 100): EndIf
Next th
MessageRequester("Threads", "Thread 1: " + Str(IsThread(mythread(1))) + #LF$ + "Thread 2: " + Str(IsThread(mythread(2))))
SavePrefs()
End
EndIf
+ Code-Tags --A.
Re: Stop Thread
Verfasst: 26.04.2022 12:48
von HeX0R
Dir ist schon klar, dass das keiner beantworten kann, ohne die Thread-Prozedur zu sehen?
Ich denke Deine Threads benötigen länger als 100ms um zum Ende zu kommen.
Ach ja, da oben gibt es code-Tags (</>), dann sind die Codes im Forum gleich viel lesbarer
Re: Stop Thread
Verfasst: 26.04.2022 15:12
von jacdelad
Code: Alles auswählen
Select WaitWindowEvent(0)
Case #PB_Event_CloseWindow
If MessageRequester ("","Programm beenden?", #PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes
state=0
;MessageRequester ("OK","Programm beendet")
Define temp_counter
Repeat
temp_counter=0
Delay(100)
For th=1 To CPU_Cores
If IsThread(mythread(th)) : temp_counter+1 : EndIf
Next
Until temp_counter=0
For th=1 To CPU_Cores
If IsThread(mythread(th)): Debug WaitThread(mythread(th), 100): EndIf
Next th
MessageRequester("Threads", "Thread 1: " + Str(IsThread(mythread(1))) + #LF$ + "Thread 2: " + Str(IsThread(mythread(2))))
SavePrefs()
End
EndIf
...wenn das Beenden länger dauert solltest du aber auch empfangene Messages bearbeiten.
Re: Stop Thread
Verfasst: 26.04.2022 18:33
von NicTheQuick
Ist 'state' global und hast du mit 'EnableExplicit' sicher gestellt, dass alle Variablen sauber deklariert sind?
Ansonsten schließe ich mich HeX0R an.
Re: Stop Thread
Verfasst: 26.04.2022 21:14
von interfind
Ich konnte das Problem weiter eingrenzen.
in meinen Thread werden einige "SetGadgetText" Befehle ausgeführ.
Dies führt anscheinend zum hängen.
Wenn ich die SetGadgetText auskommentiere , werden die Thread korrekt beendet.
Wenn ich die Befehle aber aus dem Thread auslagere dann werden die Textfelder nicht schnell genug aktualisiert.
Wie könnte man so etwas sauber lösen?
Re: Stop Thread
Verfasst: 26.04.2022 21:22
von interfind
jacdelad hat geschrieben: 26.04.2022 15:12
Code: Alles auswählen
Select WaitWindowEvent(0)
Case #PB_Event_CloseWindow
If MessageRequester ("","Programm beenden?", #PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes
state=0
;MessageRequester ("OK","Programm beendet")
Define temp_counter
Repeat
temp_counter=0
Delay(100)
For th=1 To CPU_Cores
If IsThread(mythread(th)) : temp_counter+1 : EndIf
Next
Until temp_counter=0
For th=1 To CPU_Cores
If IsThread(mythread(th)): Debug WaitThread(mythread(th), 100): EndIf
Next th
MessageRequester("Threads", "Thread 1: " + Str(IsThread(mythread(1))) + #LF$ + "Thread 2: " + Str(IsThread(mythread(2))))
SavePrefs()
End
EndIf
...wenn das Beenden länger dauert solltest du aber auch empfangene Messages bearbeiten.
Wie kann ich am besten und einfachsten empfangene Messages bearbeiten?
Re: Stop Thread
Verfasst: 26.04.2022 22:55
von NicTheQuick
Am einfachsten kannst du Messages so abarbeiten:
Aber grundsätzlich solltest du keine Gadgets aus Threads heraus updaten. Nutz dafür 'PostEvent()' und setze den Wert in deiner Hauptschleife. Ein Gadget wird sowieso nicht zuverlässig aktualisiert, wenn diese nicht läuft und die Events abgearbeitet werden.
Re: Stop Thread
Verfasst: 27.04.2022 13:51
von interfind
Hallo,
ich habe jetzt folgende Variante verwendet, die funktioniert.
Danke an alle.
Code: Alles auswählen
Procedure StopThreads()
Repeat
threadcounter=0
For th=1 To CPU_Cores
If IsThread(mythread(th)): threadcounter+1: EndIf
Next th
While WindowEvent() : Wend
Until threadcounter=0
EndProcedure
Re: Stop Thread
Verfasst: 27.04.2022 17:32
von jacdelad
Jo, sollte funktionieren. Der Ordnung halber würde ich threadcounter lokal in der Prozedur definieren.
Re: Stop Thread
Verfasst: 27.04.2022 20:49
von mk-soft
Vielleicht mal dieses anschauen ...
Link:
Mini Thread Control (DE)