Qtスレッドとタイマー【一】

2243 ワード

新しいスレッド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関数のスレッドにあるに違いない.接続(WrTimer,SIGNAL(timeout()),this,SLOT(TimerOutWr 1()),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のスレッド内でTimerOutWr 1が実行される.
次のように変更します.
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をすると、新しいスレッドで実行されます.