さて、QTimerで完全に負けました。問題は、マルチスレッド アプリケーションがあり、QTimer のタイムアウトについて何らかの作業を行う必要があることです。私はこのようにしました:
QTimer* timer = new QTimer();
timer->setSingleShot(true);
connect(timer, SIGNAL(timeout()), someObject, SLOT(work()));
そして、これはうまくいきませんでした。work() がまったく呼び出されないこともあれば、プログラムを閉じたときに呼び出されることもあり、すべてが正常に見えることもありました。
だから、タイマーにはスレッドが必要だと思いました。MCV の例を提供するには:
class Tester : public QObject
{
Q_OBJECT
public:
Tester(QObject* par = 0) : QObject(par)
{
}
public slots:
void greet()
{
qDebug()<<"hello";
}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QTimer* timer1 = new QTimer();
QThread* thread = new QThread();
Tester* tester = new Tester();
timer1->setInterval(500);
timer1->setSingleShot(false);
timer1->moveToThread(thread);
QObject::connect(thread, SIGNAL(started()), timer1, SLOT(start()));
QObject::connect(timer1, SIGNAL(timeout()), tester, SLOT(greet()));
QObject::connect(timer1, SIGNAL(timeout()), timer1, SLOT(deleteLater()));
QObject::connect(timer1, SIGNAL(destroyed()), thread, SLOT(quit()));
thread->start();
thread->wait();
delete thread;
delete tester;
return a.exec();
}
そして、この例は何もしません。挨拶しないので、タイムアウトは呼び出されず、終了しないので、スレッドは停止しません。質問は次のとおり
です。 1. このコードの何が問題なのですか?
2. マルチスレッド環境で QTimer を適切に使用するにはどうすればよいですか?