c++multithreadingqttimerqthread

Starting QTimer In A QThread


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";
    }

Solution

  • As I commented you are doing it wrong:

    1. You are mixing the object holding thread data with another object (responsible for doIt()). They should be separated.
    2. 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...