Seite 2 von 2

Re: Ende eines multithread-Programms

Verfasst: 22.02.2011 17:37
von freak
Wenn der User die Konsole schließt, wird das Programm mit ExitProcess_() beendet. Das kann man nicht verhindern, aber man kann vorher noch etwas Code ausführen:

Code: Alles auswählen

; Wichtig:
;   Dieser Callback wird in einem eigenen thread ausgeführt, also
;   ist eventuell eine Synchronisation (Mutex etc) nötig um auf globale
;   Daten zuzugreifen
Procedure ConsoleHandler(CtrlType.l)

  Select CtrlType
  
    Case #CTRL_C_EVENT, #CTRL_BREAK_EVENT
      ; diese können ignoriert werden, indem man #True zurück gibt
      ProcedureReturn #True
    
    Case #CTRL_CLOSE_EVENT      
      ; dieser kann nicht ignoriert werden. Man kann also hier noch etwas code
      ; ausführen um aufzuräumen, aber das Programm wird auf jeden fall danach
      ; beendet
      Debug "close event"
    
    Case #CTRL_LOGOFF_EVENT, #CTRL_SHUTDOWN_EVENT
      ; diese werden nur an einen Service gesendet, nicht an ein normales Programm
  
  EndSelect
  
  ProcedureReturn #False
EndProcedure

Procedure console(dummy)
  OpenConsole()
  SetConsoleCtrlHandler_(@ConsoleHandler(), #True)
  Repeat
    Input()   
    Delay(1)
  ForEver
EndProcedure

WaitThread(CreateThread(@console(),0))
Delay(50000)
End

Re: Ende eines multithread-Programms

Verfasst: 22.02.2011 19:25
von teamO
danke für den tipp.

wenn ich jetzt als aufräumcode ein delay von meinetwegen 10 Tagen mach, dann müsste ja das Hauptprogramm und alle threads erstmal weiterlaufen, wenn ich das richtig versteh.

wäre zwar hässlich, aber wenns zum Ziel führt ;)

Re: Ende eines multithread-Programms

Verfasst: 22.02.2011 20:05
von c4s
teamO hat geschrieben:danke für den tipp.

wenn ich jetzt als aufräumcode ein delay von meinetwegen 10 Tagen mach, dann müsste ja das Hauptprogramm und alle threads erstmal weiterlaufen, wenn ich das richtig versteh.

wäre zwar hässlich, aber wenns zum Ziel führt ;)
Unter Systemsteuerung kann man einstellen, wie lange auf "nicht reagierende Programme" gewartet werden soll und ich denke dieses gehört dazu. Ich glaube der Wert dafür liegt standardmäßig bei ungefähr 20 Sekunden.

Re: Ende eines multithread-Programms

Verfasst: 22.02.2011 20:15
von DarkDragon
ts-soft hat geschrieben:@DarkDragon
Der Thread endet doch, sobald die Console geschlossen wird, ist auch der Thread zu ende.
Woran das liegt frag ich mich schon seit Jahren. Dafür sollte PureBasic eine art EventConsole() anbieten und nicht einfach den Prozess abschießen lassen. Andere Programme können doch auch Strg + C und das schließen der Konsole (sogar unter Linux - etwa "top") abfangen.

Oh ich seh aber grad, freak hat dafür ja was.

Re: Ende eines multithread-Programms

Verfasst: 02.03.2011 02:00
von Blackskyliner
Im Zweifelsfall kann man sich doch, sofern man echt nur die Konsole nicht mag, den Thread weiter laufen lassen mit der Konsole und diese entsprechend über ein Hide verstecken und dann entsprechend wieder anzeigen lassen, wenn man sie doch mal wieder benötigt.

Teilweise sieht mir das ganze aber eh ein bisschen nach fail by concept aus, denn wenn es nur um Konsolen aus und Eingaben geht... das kann man auch ganz schnell selber mit ein paar kleinen Gadgets nachprogrammieren... oder so ne kleine eigene Art von Konsole schreiben, etc...