Stop Thread

Anfängerfragen zum Programmieren mit PureBasic.
interfind
Beiträge: 12
Registriert: 04.02.2022 10:41

Stop Thread

Beitrag 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.
Benutzeravatar
HeX0R
Beiträge: 2959
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: Stop Thread

Beitrag 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
Benutzeravatar
jacdelad
Beiträge: 348
Registriert: 03.02.2021 13:39
Computerausstattung: Ryzen 5800X, 108TB Festplatte, 32GB RAM, Radeon 7770OC
Wohnort: Riesa
Kontaktdaten:

Re: Stop Thread

Beitrag 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.
PureBasic 6.04/XProfan X4a/Embarcadero RAD Studio 11/Perl 5.2/Python 3.10
Windows 11/Ryzen 5800X/32GB RAM/Radeon 7770 OC/3TB SSD/11TB HDD
Synology DS1821+/36GB RAM/130TB
Synology DS920+/20GB RAM/54TB
Synology DS916+ii/8GB RAM/12TB
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8679
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Stop Thread

Beitrag 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.
Bild
interfind
Beiträge: 12
Registriert: 04.02.2022 10:41

Re: Stop Thread

Beitrag 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?
interfind
Beiträge: 12
Registriert: 04.02.2022 10:41

Re: Stop Thread

Beitrag 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?
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8679
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Stop Thread

Beitrag 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.
Bild
interfind
Beiträge: 12
Registriert: 04.02.2022 10:41

Re: Stop Thread

Beitrag 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
Benutzeravatar
jacdelad
Beiträge: 348
Registriert: 03.02.2021 13:39
Computerausstattung: Ryzen 5800X, 108TB Festplatte, 32GB RAM, Radeon 7770OC
Wohnort: Riesa
Kontaktdaten:

Re: Stop Thread

Beitrag von jacdelad »

Jo, sollte funktionieren. Der Ordnung halber würde ich threadcounter lokal in der Prozedur definieren.
Zuletzt geändert von jacdelad am 27.04.2022 22:16, insgesamt 1-mal geändert.
PureBasic 6.04/XProfan X4a/Embarcadero RAD Studio 11/Perl 5.2/Python 3.10
Windows 11/Ryzen 5800X/32GB RAM/Radeon 7770 OC/3TB SSD/11TB HDD
Synology DS1821+/36GB RAM/130TB
Synology DS920+/20GB RAM/54TB
Synology DS916+ii/8GB RAM/12TB
Benutzeravatar
mk-soft
Beiträge: 3701
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Stop Thread

Beitrag von mk-soft »

Vielleicht mal dieses anschauen ...

Link: Mini Thread Control (DE)
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten