Qtスレッドとタイマー【一】
2243 ワード
新しいスレッドrunにはexecの呼び出しが必要です.そうしないと、メッセージを受け入れることができません.
myQThrのコンストラクション関数で作ったタイマーであれば、出発イベントはmain関数のスレッドにあるに違いない.接続(WrTimer,SIGNAL(timeout()),this,SLOT(TimerOutWr 1()),Qt::DirectConnection);中はQt::DirectConnectionかQt::QueuedConnectionか.この時点で新しいスレッドは作成されていないので、実行は言うまでもありません.
さらに実行:
これによりmainのスレッド内でTimerOutWr 1が実行される.
次のように変更します.
Qt::DirectConnectionでconnectをすると、新しいスレッドで実行されます.
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をすると、新しいスレッドで実行されます.