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:

Code: Alles auswählen

While WindowEvent(): Wend
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)