Klassen Design



  • Hallo Leute,
    ich bin auf der Suche/Idee nach einer eleganten Möglichkeit,
    innerhalb eines komplexen und langwierigen Algorithmus, die Möglichkeit auf ein Signal zu reagieren.

    Im konkreten geht es darum:
    Ich habe eine GUI, diese ruft durch User Interaktion meine Klasse mit der Implementierung des Algorithmus auf. Jetzt möchte der User diesen abbrechen.

    Ich habe dies aktuell so gelöst, dass ich innerhalb der Klasse/Methode Abfrage, ob das Signal ausgelöst wurde und falls ja, breche ab!

    Dies ist aber keine elegante Lösung, denn die Klasse welche den Algorithmus implementiert, sollte meiner Meinung nach von der GUI völlig unabhängig sein, oder besser gesagt die Klasse sollte nichts über ihren aufrufenden Klienten kennen.

    Kennt jemand einen schönen weg solch ein Problem zu lösen?

    Grüße



  • Ich mache das per bool/event/somaphore oder sonstwas namens vergiftet in der Klasse. Und die wirft eine BinVergiftetException bei Bedarf. Check bei jedem Systemaufruf, der warten könnte und evtl bei laangen reinen Numbercrunchingschleifen.



  • ?Algo? schrieb:

    ob das Signal ausgelöst wurde und falls ja, breche ab!

    Das hört sich irritierend an. Ich hab schon öfter so cancel Variablen, die ich ab und zu prüfe (natürlich nicht in number crunching Schleifen). Das ist dann ok, die Klasse hat halt eine cancel() Funktion und setzt die cancel Variable auf true. Das ist keine Abhängigkeit zur GUI.



  • Ich hab schon öfter so cancel Variablen

    . Naja, ich halte dies für so schlechtes Design wie es nur geht. Ich behaupte nicht das ich es besser gelöst hätte und deshalb stelle ich auch die Frage.

    Natürlich geht es darum, dass ich eine Klasse habe, die für sich in eine Lib gehört und niemals irgendetwas über Ausführungsabbrüche kennen müsste, aber in meinem Fall Kenntnis hat. Den Ansatz von Volkard, wenn ich ihn richtig verstanden habe, müsste in pseudocode so aussehen

    class RunAlgorithm{
    public bool isCancel; // kann von aussen angetriggert werden
    
    void run(){
    
       bool isFinished= false;
       Thread thread = new Thread1(){
            Alogorithm a = new Algorithm();
            a.process();
            isFinished = true;
    
       };
       Thread observerThread = new Thread(){
           while(!isCancel ){ sleep(1); if(isFinished) break; }
       };
       thread.start();
       observerThread.start();
       thread.join();
       observerThread.join();
    
      }
    }
    

    RunAlgorithm versteckt die Algorithm Klasse und kann abgebrochen werden.

    Habe ich dich richtig verstanden Volkard?

    Grüße



  • ?Algo? schrieb:

    Habe ich dich richtig verstanden Volkard?

    Glaube nicht.

    Es geht nur um RAII.

    class ThreadWorker{
       DatabaseConnection m_dbc;
       void run()
       try{
          m_dbc=...;//muss UNBEDINGT den Destruktor aufrufen bei Threadkill
          for(...)
             //AUch hier drin beliebin viele RAII-Objekte
             //viel zu tun in allen Schleifen
             //aber hat auch mal sleep, select, write, oder sowas drin
       }
       catch(...){
          ...
       }
    
    void mySleep(int ms){
       if(threadlocal->isCancel)
          throw ThreadPoison();//einzige Möglichkeit, gracefullly auszusteigen
       ::Sleep(ms);
    }
    

Anmelden zum Antworten