Laufendes Programm beenden?



  • Ich habe ein Programm, welches mit mehreren Threads arbeitet, die alle ihre Aufgabe verrichten, was ziemlich lange dauern kann. Nachdem alle Threads beendet sind, wird noch eine Funktion zum Abschluss ausgeführt. Was ich suche ist eine Möglichkeit, das Programm während der Laufzeit so zu beenden, sodass die Abschlussfunktion in jedem Fall noch ausgeführt wird (also kein STRG+c Style). Dies sollte beispielsweise über die Tastenkombination STRG+q erfolgen. Ist dies irgendwie möglich? Wenn ja, wie? Danke vorab.



  • Naja, du kannst do einfach im Haupt-Thread auf die gewünschte Tastenkombination warten und anschließend deine Abschlussfunktion aufrufen. Wenn du dann die anderen Thread sauber beendet haben willst, ist es wohl am besten, wenn du innerhalb von diesen immer wieder eine Variable oder ein Event abfrägst, dass du dann zum beenden aus dem Haupt-Thread heraus setzt 🙂



  • Danke, aber die Frage war eher darauf bezogen, wie ich die Tastenkombination STRG+Q abfange. 🙂



  • Hast du denn eine grafische Anwendung mit Message-Loop, oder eine Konsolen-Anwendung (falls letzteres bist du hier nämlich wohl nicht ganz richtig -> dann würde ich (oder jemand anderes) das verschieben)





  • Hast du denn eine grafische Anwendung mit Message-Loop, oder eine Konsolen-Anwendung

    Es ist ein Konsolenprogramm.

    wie wäre es mit einem terminate handler ?!?

    Inwiefern hilft mir das? Werde daraus nicht so recht schlau. 😕



  • habe gerade festgestellt das der link nicht ganz so glücklich war, mein fehler.
    aber das müsste dir helfen
    http://msdn.microsoft.com/library/en-us/vclib/html/_CRT_signal.asp

    #include <iostream>
    #include <signal.h>
    
    void sigfunc(int sig)
    {
    	if(sig != SIGINT)
    		return;
    	else
    	{
    	    std::cout << "aufräumen ;-)\n";
    	    exit(-1);
    	}
    }
    
    int main(int argc, char** argv)
    {
    	int i;
    
    	signal(SIGINT, sigfunc);
    
    	while(1) { }
    
        return 0;
    }
    


  • Super, das ist genau das, was ich gesucht habe, vielen Dank! 🙂 Andere Frage auch zu diesem Thema: gibt es eine Möglichkeit, "nicht-blockierend" auf einen Tastendruck zu warten und entsprechend zu handeln?



  • versuch es mal genauer zu beschreiben. das was ich mir darunter vorstelle ist zu weit hergeholt. 😃



  • Also ich stelle mir das so vor, dass wie in dem Beispiel von dir eine Schleife dauerhaft beschäftigt ist. Dann sollten die Keyboard-Events (von einem anderen Thread?) abgefangen werden, sodass das Programm nicht-blockierend gesteuert werden kann. Wenn ich es beispielsweise mit scanf() oder cin mache, ist es ja eine blockierende Eingabe, sprich ich muss Text eingeben. Besser so? 🙂



  • sowas ähnliches habe ich mir auch vorgestellt. 😉
    starte doch die threads bevor du eingabe machst, allerdings was willst du dann mit der eingabe machen?

    vielleicht so

    //pseudo
    bool thread1()
    {
     while(thread_noch_nicht_fertig()) { mach_was(); }
     return true; // wenn er fertig ist
    }
    
    int main()
    {
     thread1(); // somit müsste thread völlig unabhängig von deiner eingabe sein
     while(!thread1()) { eingabe(); }
    }
    

    vielleicht erzählst du uns noch was über dein programm (ziel)



  • Geht nicht mehr um mein Programm, sondern um das allgemeine Verständnis. 🙂 Im Prinzip möchte ich dasselbe machen, was du mit dem SIGTERM Signal realisiert hast, nur, dass eben anstatt einem SIGTERM (STRG+C) irgendein Buchstabe "getestet" wird. Aber ist auch nicht so wichtig. 🕶


Anmelden zum Antworten