2014-06-23 100 views
2

目前我需要實現一個基於Qt的多線程算法。也許我應該嘗試延長QThread。 但在此之前,我想問一下,如果我可以只使用兩個QTimertimer1,timer2,並分別將它們的超時信號連接到線程,以實現一個「假」多線程程序?我可以使用QTimer實現多線程算法嗎?

回答

3

您可以將QTimer的timeout()信號連接到相應的插槽,並調用start()。從此,定時器將以固定的時間間隔發出timeout()信號。但是這兩個定時器在主線程和主事件循環中運行。所以你不能稱它爲多線程。因爲這兩個插槽不能同時運行。他們一個接一個地運行,如果阻塞主線程,另一個將永遠不會被調用。

您可以通過具有不同的任務一些類,應同時進行,並使用QObject::moveToThread更改該對象的線程親和力有一個真正的多線程應用程序:從QObject

QThread *thread1 = new QThread(); 
QThread *thread2 = new QThread(); 

Task1 *task1 = new Task1(); 
Task2 *task2 = new Task2(); 

task1->moveToThread(thread1); 
task2->moveToThread(thread2); 

connect(thread1, SIGNAL(started()), task1, SLOT(doWork())); 
connect(task1, SIGNAL(workFinished()), thread1, SLOT(quit())); 

connect(thread2, SIGNAL(started()), task2, SLOT(doWork())); 
connect(task2, SIGNAL(workFinished()), thread2, SLOT(quit())); 

//automatically delete thread and task object when work is done: 
connect(thread1, SIGNAL(finished()), task1, SLOT(deleteLater())); 
connect(thread1, SIGNAL(finished()), thread1, SLOT(deleteLater())); 

connect(thread2, SIGNAL(finished()), task2, SLOT(deleteLater())); 
connect(thread2, SIGNAL(finished()), thread2, SLOT(deleteLater())); 

thread1->start(); 
thread2->start(); 

注意Task1Task2繼承。

相關問題