2017-12-22 28 views
0

私はタイマーをワーカークラスで使用しようとしています。スレッドのスレッドのタイマーQt

QThread *thread = new QThread; 
    Worker *worker = new Worker; 
    worker->moveToThread(thread); 

    QObject::connect(thread, SIGNAL(started()), worker, SLOT(process()), Qt::QueuedConnection); 
    QObject::connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())); 
    QObject::connect(worker, SIGNAL(finished()), thread, SLOT(quit())); 
    QObject::connect(worker, SIGNAL(finished()), worker, SLOT(deleteLater())); 

    thread->start(); 

問題:

void Worker::process(void) 
{ 
    qDebug() << "worker process";  //This works 
    QTimer *timer = new QTimer(this); 
    connect(timer, SIGNAL(timeout()), this, SLOT(test())); 

    forever 
    { 

    } 
} 

void Worker::test(void) 
{ 
    qDebug() << "test123"; //This does not work 
} 

は、私は新しいスレッドでこのワーカークラスを開始Worker.cpp

Worker.h

class Worker : public QObject 
{ 
    Q_OBJECT 
public: 
    explicit Worker(QObject *parent = nullptr); 

signals: 
    void finished(void); 

public slots: 
    void process(void); 
    void test(void); 

private: 
    QMutex m_mutex; 

}; 

:これは私のワーカークラスですそれはtimerからWorker::processまでです 動作しません。新しいスレッドでこのタイマーを特別な方法で初期化する必要がありますか?

+0

は、タイマは、タイマの、コールstart()メソッドを起動していません。ドキュメンテーションは、「QTimerを作成し、そのタイムアウト()信号を適切なスロットに接続し、start()を呼び出す」と書いています。 http://doc.qt.io/qt-5/qtimer.htmlを見てください。 – sddk

+3

'forever {...}'は実際に何をしていますか?私はそれが毎日何度もイベントを処理していることを願っています。 –

答えて

1

タイマーの作成後にvoid QTimer::start(int msec) or void QTimer::start()に電話する必要があります。また、あなたのprocess()スロットには "永遠"は必要ありません。

は、代わりにこれを試してみてください:

void Worker::process(void) 
{ 
    qDebug() << "worker process";  //This works 
    QTimer *timer = new QTimer(this); 
    connect(timer, SIGNAL(timeout()), this, SLOT(test())); 
    timer->start(1000); // Fire timer timeout each 1000ms. 
} 
+0

ありがとうございました。愚かな間違い... – drewpol

+0

あなたは大歓迎です。 –

関連する問題