c++ - How to wait for signal in long running method? -


at moment developing simple programming language on basis of flex&bison.

for first build abstract syntax tree (ast) , continue evaluation. during evaluation shall possible receive user input. user input done in qt-gui. ast-evaluation-procedure runs in thread-worker-object, created gui. problem: 1 best way, "block" running flex&bison evaluation-procedure receive user input gui , afterwards continue executing procedure? unfortunately have no idea, how split evaluation procedure 2 parts catch user input-signal gui , continue "splitted procedure" in slot. current solution works (to opinion poor) infinite loop within evaluation procedure , runs until boolean member variable (_hasuserinput) in thread worker-object set true. after user input gui emits signal. corresponding slot inside thread worker-object. slot receives user input e.g. qstring , sets corresponding member variable. additionally boolean variable set true, infinite loop of evaluation-procedure can left, user input can processed , evaluation can continued.

functional principle:
gui --> starts thread (worker-object) --> starts longterm running procedure

example in pseudo code:

class threadworker : public qobject {      ...      // slot, reacts signal gui     void userinput(const qstring &input) {         _userinput = input;         _hasuserinput = true;     }      // evaluation-procedure     void doevaluation() {         // evaluation of ast          ...          emit userinputrequired();         while (!hasuserinput){          // check if user input has been done             qapp -> processevents();    // react events         }         user input;         continue valuation;             // processing of user input , continuation of procedure     }      ...  }; 

i tried give description of problem possible , hope worked. please ask, in case need more detailed information. in advance assistance!

since you've factored out worker qobject, should never need call processevents(). instead, break down ast evaluation small chunks performed long necessary. i've made public interface thread-safe - can call directly thread.

// see https://stackoverflow.com/a/40382821/1329652 bool issafe(qobject * obj); template <typename class, typename... args> void postcall(class * obj, void (class::*method)(args...), args&& ...args);  class astworker : public qobject {   q_object   qbasictimer m_evaluatetimer; // bit lower overhead qtimer   void timerevent(qtimerevent * ev) override {     if (ev->timerid() == m_evaluatetimer.timerid())       evaluateimpl();   }   void evaluateimpl() {     bool evaluationdone = {};     qthread::msleep(10); // emulate evaluating chunk of ast     if (!evaluationdone && !m_evaluatetimer.isactive())       m_evaluatetimer.start(0, this);     else if (evaluationdone)       m_evaluatetimer.stop();   } public:   using qobject::qobject;   /// thread-safe   q_slot void setuserinput(const data & data) {     if (!issafe(this))       return postcall(this, &astworker::setuserinput, data);     qthread::msleep(1); // emulate processing user data   }   /// thread-safe   q_slot void evaluate() {     if (!issafe(this))       return postcall(this, &astworker::evaluate, data);     evaluateimpl();   } }; 

Comments

Popular posts from this blog

javascript - Create a stacked percentage column -

Optimising Firebase database by automatically overwriting data -

javascript - Angular UI-Grid customTemplate directive causing rows to load slowly/? -