Qt线程和定时器【一】

新的线程run里面一定要有exec的调用,否则无法接受消息的。

class myQThr : public QThread  
{  
    Q_OBJECT  
public:  
    myQThr(QObject *in = NULL)  
        :QThread(in)  
    {  
        WrTimer = new QTimer(this);  
        connect(WrTimer, SIGNAL(timeout()), this, SLOT(TimerOutWr1()), Qt::DirectConnection);     
        WrTimer->start(2000);          
    }  
    void run()  
    {             
        exec();  
    }  
      
private:  
    QTimer *WrTimer;  
public slots:  
    void TimerOutWr1()  
    {  
        int a = 100;  
    }  
};  
  
#include "qt3.h"  
#include <QtWidgets/QApplication>  
  
int main(int argc, char *argv[])  
{  
    QApplication a(argc, argv);  
    qt3 w;  
    w.show();  
  
    myQThr *myt = new myQThr ;  
    myt->start();  
  
    return a.exec();  
}

只要是在myQThr的构造函数里面做的定时器,出发事件,一定是在main函数的线程里面。不管connect(WrTimer, SIGNAL(timeout()), this, SLOT(TimerOutWr1()), Qt::DirectConnection);里面用Qt::DirectConnection还是Qt::QueuedConnection。因为此时新的线程都么有创建好,更加不说运行了。

再说运行:

class myQThr : public QThread  
{  
    Q_OBJECT  
public:  
    myQThr(QObject *in = NULL)  
        :QThread(in)  
    {             
    }  
  
    void run()  
    {         
        WrTimer = new QTimer(this);  
        connect(WrTimer, SIGNAL(timeout()), this, SLOT(TimerOutWr1()), Qt::QueuedConnection);     
        WrTimer->start(2000);      
        exec();
    }
      
private:  
    QTimer *WrTimer;  
public slots:  
    void TimerOutWr1()  
    {  
        int a = 100;  
    }  
};

如此则在main的线程里面运行TimerOutWr1。

修改如下:

class myQThr : public QThread  
{  
    Q_OBJECT  
public:  
    myQThr(QObject *in = NULL)  
        :QThread(in)  
    {             
    }  
  
    void run()  
    {         
        WrTimer = new QTimer(this);  
        connect(WrTimer, SIGNAL(timeout()), this, SLOT(TimerOutWr1()), Qt::DirectConnection);     
        WrTimer->start(2000);      
        exec();  
    }  
      
private:  
    QTimer *WrTimer;  
public slots:  
    void TimerOutWr1()  
    {  
        int a = 100;  
    }  
};

用Qt::DirectConnection做connect的话,则在新建的线程里面运行了。

你可能感兴趣的:(Qt线程和定时器【一】)