Timers cannot be stopped from another thread, but how do i stop/start timer in thread?
-
wrote on 26 Jan 2012, 08:41 last edited by
I have timer inside thread that invoking function each N seconds .
now i have in my main window button that supposed stop/start this operation.
so i just created in my worker thread 2 public function for starting and stooping the timer inside the thread .
but it don't work , im getting this message :
@QObject::killTimer: timers cannot be stopped from another thread@
and when i try to start :
@QObject::startTimer: timers cannot be started from another thread@
i want to keep the thread working , and only control on the timer stop/start invocation inside the thread.
what is the right way to do it ? -
wrote on 26 Jan 2012, 08:54 last edited by
Use signals to start/stop times, check that "wiki page":http://developer.qt.nokia.com/wiki/ThreadsEventsQObjects
I hope this help you :)
-
wrote on 26 Jan 2012, 09:03 last edited by
Thanks but i dont see any solution in that page , i do use the timer solution they offer
but i need to control this timer from outside the thread -
wrote on 26 Jan 2012, 09:07 last edited by
Add a signal to your thread class, for example
@
signal startTimer();
signal stopTimer();
@
And connect it on your main class/thread, emit the signals when you want to start/stop the timer. -
wrote on 26 Jan 2012, 09:38 last edited by
Thanks , i found the answer simple using the :
@QMetaObject::invokeMethod(object, "methodName",
Qt::QueuedConnection,
Q_ARG(type1, arg1),
Q_ARG(type2, arg2));
@ -
wrote on 26 Jan 2012, 09:41 last edited by
Be aware that slots are executed in the thread a QObject* has been created or move to, which is usually not the thread that was spawned by subclassing QThread. Thus it is recommended to not subclass QThread but creating a QObject that contains all the functionality and then moving this object to an ordinary QThread.
@
class Worker : public QObject
{
public:
Worker(QObject* parent = 0) : QObject(parent), _timer(new QTimer(this))
{
...
connect(_timer, SIGNAL(timeout()), this, SLOT(work()));
}public slots:
void startTimer() { _timer->start(); }
void stopTimer() { _timer->stop(); }private slots:
work()
{
...
}private:
QTimer* _timer;
};...
QThread* thread = new QThread;
Worker* worker = new Worker;
worker->moveToThread(thread);
connect(..., ..., worker, SLOT(startTimer()));
connect(..., ..., worker, SLOT(stopTimer()));thread->start();
@
Brain to terminal. Not tested. Exemplary. -
wrote on 26 Jan 2012, 11:22 last edited by
This is what i did , this is how i set my thread :
@m_MyThread = new QThread();
m_MainWorker = new MainWorker();
connect(m_MyThread,SIGNAL(started()),m_MainWorker,SLOT(doWork()));
m_MainWorker->moveToThread(m_MyThread);
m_MyThread->start();@ -
1/7