2017-12-22 34 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

타이머가 시작되지 시작 호출() 타이머의 방법을. 설명서에 "QTimer를 만들고, QTimer를 만들고, 해당 슬롯에 timeout() 신호를 연결하고, 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

당신은 환영합니다. –