2012-11-16 78 views
1

我從以下鏈接中學習到,對QThread進行子類別分類並不是正確的使用方法...正確的方法是對QObject進行子類化,然後將QObject類別的對象移動到各自的線程使用moveToThread()函數...我跟着以下鏈接.. link 1link 2 ...但我的問題是,那麼我將如何能夠使用msleep()和usleep()保護靜態函數?或者我會使用QTimer使線程等待一段時間?QThread:如何使用受保護的靜態函數

+0

這個問題是否真的與QT有直接關係?請發佈[SSCCE](http://sscce.org),說明您正在嘗試解決的問題。 –

+2

他使用Qt API(QThread,QObject),所以它與Qt相關。 –

回答

2

無需定時器。爲了等待,Qt提供了QWaitCondition。你可以這樣實現:

#include <QWaitCondition> 
#include <QMutex> 

void threadSleep(unsigned long ms) 
{ 
    QMutex mutex; 
    mutex.lock(); 
    QWaitCondition waitCond; 
    waitCond.wait(&mutex, ms); 
    mutex.unlock(); 
} 

這是一個正常的功能。你當然也可以把它作爲一個成員函數來實現,如果你願意的話(在這種情況下,它可以是一個static成員)。

1

一種解決方案是創建一個定時器:

class Worker: public QObject 
{ 
///... 

private slots: 
void doWork() 
{ 
    //... 
    QTimer::singleShot(delay, this, SLOT(continueDoingWork())); 
} 

void continueDoingWork() 
{ 
} 
}; 

有時候,你只需要在不同的線程運行的操作,並且所有這些事件循環和線程的開銷。然後你可以使用QtConcurent框架:

class Worker 
{ 
public: 
void doWork() 
{ 
//... 
} 
} worker; 

//... 

QtConcurent::run(worker, &Worker::doWork); 

然後,我通常使用互斥來模擬睡眠操作:

QMutex m; 
m.lock(); 
m.tryLock(delay); 
1

的規範答案是「使用信號和槽。」例如,如果您希望某個線程中的QObject在一段時間後「喚醒自己」,請考慮QTimer::singleShot(),將槽作爲第三個參數傳遞。請參閱QTimer::singleShot()。這可以從槽中調用,導致定期執行。

+0

似乎過於複雜的同步,阻止代碼。 –

0

如果沒有這個線程的配合,你不能讓一個不同的線程休眠,這就是QThread成員函數被保護的原因。如果你想睡一個不同的線程,你需要使用一個條件變量或一個定時器內部

如果你想睡覺當前線程與usleep(),最簡單的方法是繼承它 - 它完全罰款只要你不要不需要QThreadPool,線程本地事件循環或類似的。

相關問題