Dauerschleife über einen Start/Stop Button starten und beenden



  • Hallo Community,
    hier bin ich schon wieder diesmal mit einer ganz anderen Frage. Ich starte über einen Klick eine Funktion. Nun will ich das sich die Funktion sich solange wiederholt bis ich erneut den Button klicke. Wenn ich jetzt aber einfach sagen

    while(1)
    {
    ...
    }
    

    dann legt es mir das ganze Programm lahm. Wie man am Quelltext vielleicht auch erkennen kann hab ich außerdem keine Ahnung wie man die Funktion über einen zweiten klick beenden kann. Hab es schon mit einem zweiten Button versucht aber wie schon gesagt nach dem starten der Schleife ist das ganze Programm lahmgelegt.
    Wenn mich grad jemand in die richtige Richtung stumpen könnte wäre ich sehr dankbar. Hab bei meinen Recherchen noch nichts brauchbares entdeckt bzw. vielleicht auch einfach nicht verstanden.
    Gruß
    Timy



  • Das Stichwort lautet "Thread".
    Du darfst die Endlosschleife nicht im GUI-Thread ausführen, weil dann die GUI solange blockiert ist. Also einfach einen neuen Thread starten, und bei dem Klick auf Stop den Thread wieder beenden.



  • Danke DarkShadow44 !!!
    Das war genau der Anstoß den ich gebraucht habe 🙂
    Damit Thread starten

    private: System::Void button4_Click(System::Object^  sender, System::EventArgs^  e) 
    		 {
    			this->demoThread = gcnew Thread(gcnew ThreadStart(this,&Form1::ThreadProcSafe));
    			this->demoThread->Start();			
    		 }
    

    Dann definieren was darin ablaufen soll

    private: void ThreadProcSafe()
    		 {
                     while(1) {}
             }
    

    Und dann ganz bequem beenden

    private: System::Void button2_Click_1(System::Object^  sender, System::EventArgs^  e) 
    		 {
    			 this->demoThread->Abort();
             }
    


  • Also Programm läuft soweit. Nur ein Problem gibt es noch. Ich öffne in der Klasse mit der Dauerschleife auch einen StreamWriter. Wenn ich nun aber den Thread beende läuft dieser weiter. Hab jetzt schon an verschiedenen Stellen versucht diesen zu schließen aber ohne Erfolg. Ich benötige die Datei die während der Dauerschleife entsteht um mit dieser weiterzuarbeiten. Solange aber der Stream nicht beendet wird bleibt auch die Datei in einen Prozess eingebunden und lässt sich so nicht weiter verwenden. Was kann ich tun?



  • "Thread:Abort" ist sowieso keine gute Idee.
    Du musst (solltest) dem Thread nur ein Signal geben sich bitte zu beenden.

    Pseudocode:

    volatile bool runnig=true;
    void ThreadProcSafe()
    {
        while(runnig) {}
        //Cleanup
    }
    
    void start()
    {
        runnig = true;
        //Start Thread
    }
    
    void stop()
    {
        runnig = false;
    }
    

    Ist jetzt nicht die elgeganteste Lösung, sollte aber gehen...



  • Ja so ein einfacher Abbruch ist wirklich nicht die beste Lösung. Da ist es auch klar warum der StreamWriter nicht beendet wird weil er einfach abbricht und nicht bis zum Ende durchläuft.
    Danke DarkShadow! hast mir echt geholfen Programm läuft wunderbar!



  • Und wie immer, der obligatorische Link: http://www.c-plusplus.net/forum/263084

    Man sollte fast einführen, dass jeder, der hier posten will, zuerst diesen Beitrag lesen mus... 😉



  • Sry dot, die Sprache war eine Vorgabe nicht meine Wahl!


Anmelden zum Antworten