Starting QTimer In A QThread
c++, multithreading, qt, qthread, timer
Solution
As I commented you are doing it wrong:
- You are mixing the object holding thread data with another object (responsible for `doIt()`). They should be separated.
- There is no need to subclass `QThread` in your case. Worse, you are overriding the `run` method without any consideration of what it was doing.
This portion of code should be enough
QThread* somethread = new QThread(this);
QTimer* timer = new QTimer(0); //parent must be null
timer->setInterval(1);
timer->moveToThread(somethread);
//connect what you want
somethread->start();
Now (Qt version >=5) by default `QThread` starts an event loop in its `run()` method. In order to run inside a thread, you just need to move the object. Read the doc...
Problem
I am trying to start a QTimer in a specific thread. However, the timer does not seem to execute and nothing is printing out. Is it something to do with the timer, the slot or the thread? main.cpp ``` #include "MyThread.h" #include <iostream> using namespace std; int main(int argc, char *argv[]) { MyThread t; t.start(); while(1); } ``` MyThread.h ``` #ifndef MYTHREAD_H #define MYTHREAD_H #include <QTimer> #include <QThread> #include <iostream> class MyThread : public QThread { Q_OBJECT public: MyThread(); public slots: void doIt(); protected: void run(); }; #endif /* MYTHREAD_H */ ``` MyThread.cpp ``` #include "MyThread.h" using namespace std; MyThread::MyThread() { moveToThread(this); } void MyThread::run() { QTimer* timer = new QTimer(this); timer->setInterval(1); timer->connect(timer, SIGNAL(timeout()), this, SLOT(doIt())); timer->start(); } void MyThread::doIt(){ cout << "it works"; } ```