Ende eines multithread-Programms

Anfängerfragen zum Programmieren mit PureBasic.
freak
PureBasic Team
Beiträge: 766
Registriert: 29.08.2004 00:20
Wohnort: Stuttgart

Re: Ende eines multithread-Programms

Beitrag 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
teamO
Beiträge: 56
Registriert: 01.03.2010 20:01

Re: Ende eines multithread-Programms

Beitrag 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 ;)
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: Ende eines multithread-Programms

Beitrag 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.
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Ende eines multithread-Programms

Beitrag 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.
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
Blackskyliner
Beiträge: 532
Registriert: 28.07.2005 00:54
Wohnort: /home/Blackskyliner/

Re: Ende eines multithread-Programms

Beitrag 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...
Keine meiner Antworten ist endgültig, es kann passieren, dass ich den so eben geposteten Beitrag noch mehrmals ändere, um Doppelposts zu umgehen.
_________________
Purebasic Windows 7 x64 & Linux (Ubuntu 10.04LTS) 4.50[x64|x86] Nutzer
_________________
Projekte: YAED - Yet another Event Dispatcher
Antworten