qthread - QTimer does not fire (trigger) timeout -
i want use qtimer pause executing of given block of codes, while in thread else. connected timeout of thread qeventloop quit, problem is, timeout not called. when emit occures, timeout magically triggered or if add connect time out triggered too. think miss use of qtimer, qeventloop , qthread. can help? extracted basic code testing , put here:
main.cpp
#include "widget.h" #include <qapplication> #include "tim.h" #include <qthread> int main(int argc, char *argv[]) { qapplication a(argc, argv); widget *w=new widget(); tim *t=new tim(); qthread *thread=new qthread(); t->movetothread(thread); thread->start(); qthread::connect(w,signal(signaldoit()),t,slot(slotdoit()),qt::queuedconnection); qthread::connect(w,signal(signalquittimer()),t,slot(slotquittimer()),qt::queuedconnection); qthread::connect(t,signal(signalsettext(qstring)),w,slot(slotsettext(qstring)),qt::queuedconnection); w->show(); return a.exec(); } tim.h
#ifndef tim_h #define tim_h #include <qobject> #include<qtimer> #include<qtime> #include<qeventloop> #include<qthread> #include<qdebug> class tim : public qobject { q_object public: tim(); ~tim(); signals: void signalsettext(qstring); public slots: void slotdoit(); void slotquittimer(); void slotshowtime(); private: qtimer *trainingtimer; qeventloop looptrainingwait; qtime time; }; #endif // tim_h tim.cpp
#include "tim.h" tim::tim() { qdebug()<<"constructor"; trainingtimer=new qtimer(this); trainingtimer->settimertype(qt::precisetimer); trainingtimer->setsingleshot(true); qthread::connect(trainingtimer,signal(timeout()),&looptrainingwait,slot(quit())); // qthread::connect(trainingtimer,signal(timeout()),this,slot(slotshowtime())); //to uncomment works, withou this, not } void tim::slotdoit() { trainingtimer->start(5000); time.start(); looptrainingwait.exec(); qstring text(qstring::number(looptrainingwait.isrunning())+" "+ qstring::number(time.elapsed())); qdebug()<<text; emit signalsettext(text); } void tim::slotshowtime() { qstring text(qstring::number(looptrainingwait.isrunning())+" slot "+ qstring::number(time.elapsed())); qdebug()<<text; emit signalsettext(text); } void tim::slotquittimer() { if(looptrainingwait.isrunning()) looptrainingwait.quit(); if(trainingtimer->isactive()) trainingtimer->stop(); } tim::~tim() { } //gui testing widget.h
#ifndef widget_h #define widget_h #include <qwidget> namespace ui { class widget; } class widget : public qwidget { q_object public: explicit widget(qwidget *parent = 0); ~widget(); public slots: void slotsettext(qstring text); signals: void signaldoit(); void signalquittimer(); private slots: void on_pushbutton_clicked(); void on_pushbutton_2_clicked(); void on_pushbutton_3_clicked(); private: ui::widget *ui; }; #endif // widget_h widget.cpp
#include "widget.h" #include "ui_widget.h" widget::widget(qwidget *parent) : qwidget(parent), ui(new ui::widget) { ui->setupui(this); } void widget::slotsettext(qstring text) { ui->label->settext(text); } widget::~widget() { delete ui; } void widget::on_pushbutton_clicked() { this->close(); } void widget::on_pushbutton_2_clicked() { emit signaldoit(); } void widget::on_pushbutton_3_clicked() { emit signalquittimer(); }
i met same issue,and wrote slot between "public" , ":",then works
Comments
Post a Comment