Thread abbrechen



  • Hallihallo!

    Ich habe in meinem Programm einen Dialog, mit dem eine einzelne Berechnung in einem eigenen Thread gestartet wird. Dazu gibt es zwei Schaltflächen im Dialog: eine, um die Iteration zu starten und eine, um sie zu stoppen. Wird die Schaltfläche "Starten" betätigt, ruft das Programm die entsprechende Methode auf, in der dann mit ResumeThread(myThread) der schon vorher erstellte Thread gestartet wird. Wie kann ich jetzt beim Drücken von "Stop" die Iteration wieder stoppen, falls dem Benutzer die Berechnung zu lange dauert? Gibt es dafür auch eine Methode? Hab irgendwie noch nichts brauchbares gefunden, was funktioniert...
    Danke schonmal! 😃

    Meike



  • Du könntest den Thread mit SuspendThread() auf Eis legen (dann kann er beim nächsten "Start"-Befehl an der selben Stelle fortsetzen).
    Komplett beenden sollte der Thread sich lieber selber - indem du eine bool-Variable im Hauptprogramm setzt und regelmäßig im Thread überprüfst.



  • Prinzipiell ist das zwar eine gute Idee, aber wenn der Benutzer zum Beispiel den Startwert für die Iteration ändert und neu berechnen möchte, dann möchte ich den Thread ja nicht wieder dort aufnehmen, wo er stehen geblieben ist, sondern die Berechnung neu anfangen...



  • In dem Fall benötist du die Variante mit der bool-Variable:

    void thrdFunc()
    {
      while(cont)
      {
        //rechnen
      }
    };
    
    OnChange()//User ändert Startwerte
    {
      cont=false;
      ResumeThread(thr);//der Thread beendet sich bei nächstbester Gelegenheit
    }
    
    OnStart()
    {
      if(!cont)
      {
        //Thread (neu) initialisieren
        cont=true;
      }
      ResumeThread(thr);
    }
    
    OnStop()
    {
      SuspendThread(thr);
    }
    


  • Das hört sich gut an, so werd ich das mal probieren!



  • Hallo!

    Habs jetzt noch ein klein bisschen anders gelöst:

    OnStart() 
    {
    	cont = false;
    	ResumeThread(myThread);
    }
    
    OnStop() 
    {
    	SuspendThread(myThread);
    	cont = true;
    	ResumeThread(myThread);
    }
    
    void thrdFunc()
    {
        while(!cont)
          // rechne
    }
    

    Das tuts 😃


Anmelden zum Antworten