Boost Thread schlafen legen bis zu einem Event



  • Nabend zusammen,

    ich habe bei mir aktuell 2 Boost Threads am laufen.
    Aus meiner GUI(Checkbox) erhalte ich über ein Signal eine Information welcher der beiden Threads nun schlafen gelegt werden soll, bis die Checkbox wieder Checked ist zu dem jeweiligen Thread.

    Ich habe mir auf:
    http://www.boost.org/doc/libs/1_53_0/doc/html/thread/synchronization.html#thread.synchronization.condvar_ref

    alles soweit dazu durch gelesen aber ich verstehe es leider nicht 100% und hoffe daher hier auf Hilfe.
    Einen Thread einfach schlafen legen und ihn wieder aufwecken ohne Zeitangabe geht bei Boost anscheinend nicht.

    Soweit ich das nun verstanden habe muss ich es über Condition_Variable lösen.
    Und genau hier bin ich mir nicht ganz sicher wie 😕

    Meine Beiden Threads heißen:
    depth_thread_1 und depth_thread_2

    Aus der GUI kommt das Signal mit der ID des Threads an meine SlotFunktion
    clientPause (int id)

    Ich möchte nun gerne den jeweiligen Thread welcher schlafen gelegt werden soll, solange schlafen legen, bis aus der GUI ein Signal kommt, dass die Checkbox des jeweilen Clients wieder Checked ist.

    Auf der Boost Documentation Seite sehe ich leider nirgends, wie ich eine bestimmte Condition Variable einem Thread zuordne?
    Und auch sonst ob und wie ich das korrekt auf mein Problem bezogen umsetzen muss?

    boost::condition_variable cond;
    boost::mutex mut;
    bool data_ready;
    
    void process_data();
    
    void wait_for_data_to_process()
    {
        boost::unique_lock<boost::mutex> lock(mut);
        while(!data_ready)
        {
            cond.wait(lock);
        }
        process_data();
    }
    
    void retrieve_data();
    void prepare_data();
    
    void prepare_data_for_processing()
    {
        retrieve_data();
        prepare_data();
        {
            boost::lock_guard<boost::mutex> lock(mut);
            data_ready=true;
        }
        cond.notify_one();
    }
    

    Ich bin für jede Hilfe dankbar 🙂

    Gruß Scriper





  • Scriper schrieb:

    Auf der Boost Documentation Seite sehe ich leider nirgends, wie ich eine bestimmte Condition Variable einem Thread zuordne?

    Das kannst du auch nicht. Macht man auch nicht. Braucht man auch nicht.

    Mach pro Thread eine Condition-Variable, und jeder Thread wartet dann nur auf "seine" Condition-Variable.

    Und auch sonst ob und wie ich das korrekt auf mein Problem bezogen umsetzen muss?

    Ich verstehe ehrlich gesagt dein Problem nicht ganz, von daher schwer was konkreteres dazu zu sagen.

    ps: Du kannst natürlich auch die selbe Condition-Variable für beide Threads verwenden. Dann musst du aber notify_all statt notify_one verwenden. Wobei ich die Variante mit zwei Condition-Variablen und notify_one vorziehen würde, weil sie weniger Overhead hat.



  • Wie mache ich denn genau Pro Thread eine Condition Variable also wo muss ich sie erstellen bzw. wie weiß ich/der Code das die Condition Variable jetzt diesem Thread gehört?

    Ich versuch mein Problem nochmal anders kurz zusammen zu fassen:

    Aus der GUI Klasse kommt ein Signal ob eine Checkbox "checked" ist oder auch nicht.
    Ist die Checkbox nicht "checked" so soll der Thread zu dem diese Checkbox gehört solange unterbrochen werden bis die Checkbox wieder "checked" ist.
    Der andere Thread soll ohne Beeinträchtigung weiter laufen.



  • OMG lern bitte programmieren.



  • Sehr nette Antwort ...

    Erleuchte mich doch einfach mit deiner Weisheit? Dann kann ich das in Zukunft auch und muss nichtmehr fragen 🙄



  • Dir wurde im anderen Thread schon gesagt dass du Container verwenden sollst.
    Statt zu versuchen das zu verstehen gehst du da aber lieber davon aus dass wir dich nicht verstanden haben.
    Haben wir schon, nur du hast eben keinen Tau von Programmieren.

    Und zum Vermitteln von Grundlagen ist das Forum hier nicht da.

    Davon abgesehen...

    Wie mache ich denn genau Pro Thread eine Condition Variable also wo muss ich sie erstellen bzw. wie weiß ich/der Code das die Condition Variable jetzt diesem Thread gehört?

    Wie machst du denn genau pro Thread einen Thread? Hm? Na, genau so machst du dann pro Thread eine Condition Variable 🙄

    Pack einfach Thread und Condition Variable in eine Klasse/Struct, und von der erzeugst du dann mehrere Objekte.


Anmelden zum Antworten