Ende eines multithread-Programms

Anfängerfragen zum Programmieren mit PureBasic.
teamO
Beiträge: 56
Registriert: 01.03.2010 20:01

Ende eines multithread-Programms

Beitrag von teamO »

Hi,

bin grad auf ein Problem mit dem Beenden eines multi-thread-Programms gestoßen:
in dem Programm wird in einem thread ein Konsolenfenster geöffnet.
das Problem: sobald das Fenster geschlossen wird, werden alles threads gekillt -das will ich aber nicht: das Programm soll weiter laufen.

Hab schon in der Hilfe nachgeschaut, aber da steht, dass ein Multithreadprogamm endet, wenn das Hauptprogramm beendet wird, was bei mir ja nicht der Fall war...

hat jemand ne idee, woran das liegt? oder wie ich das am besten hinbekomm?

Grüße,
teamO
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Ende eines multithread-Programms

Beitrag von STARGÅTE »

Dann lass dein Programm doch einfach beim schließen der Console nicht beenden. :freak:
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
teamO
Beiträge: 56
Registriert: 01.03.2010 20:01

Re: Ende eines multithread-Programms

Beitrag von teamO »

hä?
das ist doch grad das Problem.

ok, was ich geschrieben hab war vielleicht missverständlich. Was ich sagen wollte:
ich lass das Programm nicht schließen, wenn die Console beendet wird. es beendet sich selbst.

sieht ungefähr so aus:

Code: Alles auswählen


Procedure console(dummy)
  OpenConsole()
  Repeat
    Input()   
    Delay(1)
  ForEver
EndProcedure

;bla bla bla

CreateThread(@console(),0)

;bla bla bla
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Ende eines multithread-Programms

Beitrag von STARGÅTE »

Ja weil das Hauptprogramm am Ende Beendet wird.

Einfach warten:

Code: Alles auswählen

Procedure console(dummy)
  OpenConsole()
  Repeat
    Input()   
    Delay(1)
  ForEver
EndProcedure
WaitThread(CreateThread(@console(),0))
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
teamO
Beiträge: 56
Registriert: 01.03.2010 20:01

Re: Ende eines multithread-Programms

Beitrag von teamO »

das funktioniert bei mir nicht.
nur zur sicherheit, dass wir nicht aneinander vorbei reden: Hauptprogramm = programmteil, der nicht in externen threads gestartet wurde?

hier mal dein Beispiel:

Code: Alles auswählen

Procedure console(dummy)
  OpenConsole()
  Repeat
    Input()   
    Delay(1)
  ForEver
EndProcedure

WaitThread(CreateThread(@console(),0))
Delay(50000)
End
Das delay wird nicht mehr erreicht. nach meinem Verständnis von waitThread müsste es aber direkt nachdem die console geschlossen wird "ausgeführt" werden.
Das Programm wird aber schon vorher beendet.

Ich versteh das nicht...
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Ende eines multithread-Programms

Beitrag von ts-soft »

Ein Process kann nur eine Console haben. Befindet sich diese in einem Thread, ist dieser Thread damit
auch das MainProgramm, somit wird das Programm mit der Console geschlossen.
PS: Console hat in einem Thread nichts zu suchen.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Ende eines multithread-Programms

Beitrag von DarkDragon »

teamO hat geschrieben:das funktioniert bei mir nicht.
nur zur sicherheit, dass wir nicht aneinander vorbei reden: Hauptprogramm = programmteil, der nicht in externen threads gestartet wurde?

hier mal dein Beispiel:

Code: Alles auswählen

Procedure console(dummy)
  OpenConsole()
  Repeat
    Input()   
    Delay(1)
  ForEver
EndProcedure

WaitThread(CreateThread(@console(),0))
Delay(50000)
End
Das delay wird nicht mehr erreicht. nach meinem Verständnis von waitThread müsste es aber direkt nachdem die console geschlossen wird "ausgeführt" werden.
Das Programm wird aber schon vorher beendet.

Ich versteh das nicht...
Ja klar, WaitThread wartet ja auch bis der Thread zuende ist ;-) . Da der Thread aber ja NIE, wirklich NIE endet (desshalb auch ForEver und nicht MaybeForEver :lol: ) kommt es auch nie aus WaitThread raus.

@ts-soft: Console hat sehrwohl was in EINEM Thread zu suchen.
Zuletzt geändert von DarkDragon am 22.02.2011 16:51, insgesamt 1-mal geändert.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Ende eines multithread-Programms

Beitrag von Bisonte »

Code: Alles auswählen

Procedure console(dummy)
  OpenConsole()
  Repeat
    Input()   
    Delay(1)
  ForEver
EndProcedure

t = CreateThread(@console(),0)

Repeat
  
  If IsThread(t)
    Quit = 0
  Else
    Quit = 1
  EndIf
  
Until Quit = 1

Debug "Ende"
End 
Das Debug wird am Ende nur erreicht, wenn Threadsafe eingeschaltet ist... auch komisch... oder ?
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
teamO
Beiträge: 56
Registriert: 01.03.2010 20:01

Re: Ende eines multithread-Programms

Beitrag von teamO »

ok, danke für die Antworten

jetzt ist mir immerhin schon mal klar, an was es liegt...

aber kann ich irgendwie verhindern, dass alles mit dem schließen der Console beendet wird?
das würde sich ja auch nicht ändern, wenn ich die console aus dem thread raus ins hauptprogramm verlege...
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Ende eines multithread-Programms

Beitrag von ts-soft »

@DarkDragon
Der Thread endet doch, sobald die Console geschlossen wird, ist auch der Thread zu ende.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten