2017-12-22 13 views
0

Ich versuche, Timer in der Arbeiterklasse zu verwenden. Dies ist meine Arbeiter Klasse:Timer in Thread-Arbeiter Qt

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; 

}; 

Worker.cpp

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 
} 

ich diese Arbeiter Klasse in neuen Thread starten:

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(); 

Das Problem ist das timer von Worker::process funktioniert nicht. Muss ich diesen Timer im neuen Thread auf besondere Weise initialisieren?

+0

Timer gestartet wird nicht, rufen Sie() -Methode des Timer starten. Dokumentation sagt "Um es zu verwenden, erstellen Sie einen QTimer, verbinden Sie sein timeout() Signal mit den passenden Steckplätzen, und rufen Sie start() auf." Sehen Sie sich http://doc.qt.io/qt-5/qtimer.html an – sddk

+3

Was macht 'forever {...}' eigentlich? Ich hoffe, dass es ab und zu Ereignisse verarbeitet. –

Antwort

1

Sie müssen nach dem Erstellen des Timers void QTimer::start(int msec) or void QTimer::start() anrufen. Sie brauchen auch nicht für immer in Ihrem Prozess() -Slot.

Versuchen Sie stattdessen:

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

Vielen Dank. Dumme Fehler ... – drewpol

+0

Gern geschehen. –