我從以下鏈接中學習到,對QThread進行子類別分類並不是正確的使用方法...正確的方法是對QObject進行子類化,然後將QObject類別的對象移動到各自的線程使用moveToThread()函數...我跟着以下鏈接.. link 1和link 2 ...但我的問題是,那麼我將如何能夠使用msleep()和usleep()保護靜態函數?或者我會使用QTimer使線程等待一段時間?QThread:如何使用受保護的靜態函數
1
A
回答
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
,線程本地事件循環或類似的。
相關問題
- 1. 如何保護靜態函數/變量
- 2. 如何使用受保護的/私有靜態變量?
- 3. 如何在php中使用受保護的靜態?
- 4. 如何在Kohana中設置受保護的靜態文件3.1
- 5. ui是受保護的,但如何在重新實現的Qthread run()函數中使用它
- 6. 如何使用護照快遞保護靜態文件夾
- 7. 從模板化(靜態)成員函數訪問受保護的成員
- 8. 如何使用非靜態函數內部靜態函數
- 9. 從Scala調用受保護的靜態Java方法
- 10. 我想用在與受保護的靜態OOP
- 11. 如何在c#中調用受保護的構造函數?
- 12. Scala中的受保護函數
- 13. 受保護的內部構造函數
- 14. 保護基類的靜態
- 15. 如何使用WIF來保護對靜態文件的訪問?
- 16. 受保護的靜態成員的繼承類
- 17. 使用受保護的構造函數的C++常量實例?
- 18. Esd受保護的工作站 - 如何測試我的工作站的靜態?
- 19. 無法訪問受保護的靜態變量PHP 7.0.13
- 20. PHP從靜態方法訪問對象的受保護屬性
- 21. 通過繼承共享的靜態受保護資源
- 22. 休眠使用受保護的默認構造函數失敗
- 23. 有沒有用於使受保護的析構函數虛擬?
- 24. 使用make_shared與受保護的構造函數+抽象接口
- 25. 使用受保護的析構函數刪除對象
- 26. Tomcat保護靜態內容
- 27. Java:從對象靜態類使用鑄造披露受保護的值
- 28. 在另一個文件中使用受保護的靜態變量
- 29. 如何從Actor類繼承受保護的函數?
- 30. 如何從另一個靜態函數調用靜態函數
這個問題是否真的與QT有直接關係?請發佈[SSCCE](http://sscce.org),說明您正在嘗試解決的問題。 –
他使用Qt API(QThread,QObject),所以它與Qt相關。 –