Seite 1 von 2

Ende eines multithread-Programms

Verfasst: 22.02.2011 15:56
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

Re: Ende eines multithread-Programms

Verfasst: 22.02.2011 16:01
von STARGÅTE
Dann lass dein Programm doch einfach beim schließen der Console nicht beenden. :freak:

Re: Ende eines multithread-Programms

Verfasst: 22.02.2011 16:07
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

Re: Ende eines multithread-Programms

Verfasst: 22.02.2011 16:17
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))

Re: Ende eines multithread-Programms

Verfasst: 22.02.2011 16:36
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...

Re: Ende eines multithread-Programms

Verfasst: 22.02.2011 16:49
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.

Re: Ende eines multithread-Programms

Verfasst: 22.02.2011 16:50
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.

Re: Ende eines multithread-Programms

Verfasst: 22.02.2011 16:51
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 ?

Re: Ende eines multithread-Programms

Verfasst: 22.02.2011 17:01
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...

Re: Ende eines multithread-Programms

Verfasst: 22.02.2011 17:03
von ts-soft
@DarkDragon
Der Thread endet doch, sobald die Console geschlossen wird, ist auch der Thread zu ende.