我想知道是否有取消暫停睡眠線程的Qt
我使用的QThread :: msleep(MS)函數
暫停線程的方式,我想之前取消暫停線程時間用完
有什麼辦法可以做到嗎?所有的
如何取消暫停線程的Qt
0
A
回答
4
首先,如果你使用QSerialPort
,你真的不必亂用線程。你應該異步處理它。因此,您在連接到readyRead()
信號的插槽中使用read()
,並且如果您希望在寫入之間有一些延遲,請使用QTimer
和write()
連接到timeout()
信號的插槽中,如@ deW1的註釋所示。
如果你真的想要去與多線程,@ sploid代碼方法有不少錯誤:
一個互斥,必須由鎖定它的線程只能解鎖。以下是documentation for QMutex::unlock()
說的:
解鎖互斥鎖。 試圖在不同的線程中解鎖互斥鎖,導致錯誤。解鎖未鎖定的互斥鎖會導致未定義的行爲。
- 甲
QMutex
用於保護的對象,數據結構或代碼部分,使得只有一個線程可以在一個時間訪問它。它不用於一個線程信號某些其他線程。 - A
QWaitCondition
允許線程告訴其他線程滿足某種條件。這是你需要用來告訴其他線程「取消暫停」。
這裏是怎麼了應該完成的事情:
class Thread : public QThread{
public:
Thread(QObject* parent=nullptr):QThread(parent){
}
~Thread(){}
void InterruptWaitState(){
QMutexLocker locker(&mutex);
cond.wakeAll();
}
protected:
void run(){
//waiting thread
QMutexLocker locker(&mutex);
if(cond.wait(&mutex, 5000)){
// unlock from another place
} else {
// exit by timeout
}
}
private:
QMutex mutex;
QWaitCondition cond;
};
-2
QMutex mut;
void InterruptMethod() {
mut.unlock();
}
void SleepMethod() {
mut.lock();
const int kTimeout = 5000;
bool over_event_come = mut.tryLock(kTimeout); // here was sleep
if (over_event_come) {
// unlock from another place
} else {
// exit by timeout
}
mut.unlock();
}
+0
解決了我的問題,謝謝! – creekorful
+1
請不要從鎖定它的線程以外的線程解鎖互斥鎖。看到我的答案。 – Mike
相關問題
- 1. 暫停和取消暫停線程
- 2. 如何停止,暫停,取消java中的線程
- 3. 線程暫停
- 4. Qt,如何暫停QThread
- 5. 暫停和取消暫停AS2動畫
- 6. 氣流取消暫停DAG編程?
- 7. PyCharm - 如何暫停所有線程
- 8. 如何暫停和恢復線程
- 9. 如何暫停執行線程
- 10. 如何暫停一個線程?
- 11. 如何暫停主u.i線程(Android)
- 12. 如何在java中暫停線程?
- 13. Swift iOS如何暫停線程
- 14. 如何暫停和恢復線程?
- 15. 如何暫停和恢復surfaceView線程
- 16. 如何暫停一個線程(python)
- 17. 殺死暫停的線程
- 18. 任務取消暫停UI
- 19. 取消暫停這個NSTimer?
- 20. 如何通過主線程的名稱暫停線程?
- 21. 多線程暫停第二個線程
- 22. 在ExitDialog上暫停線程
- 23. 什麼是暫停線程?
- 24. 暫停Windows服務線程?
- 25. Python暫停線程執行
- 26. 暫停/恢復線程?
- 27. 「暫停」,線程與屬性
- 28. 暫停在工作線程
- 29. Android:暫停線程幾秒
- 30. WPF - 暫停UI線程?
你能爲你的問題更多的情況下,要做到這一點,爲什麼呢?你是否試圖並行運行兩個線程訪問相同的資源?如果是這樣,只是使用互斥體,你什麼意思是「在時間用完之前」,這是非常大的,因爲它看起來 – Alex
看看'QMutex'和'QWaitCondition' – deW1
我有一個名爲SerialSender(QThread的實現)數據使用QSerialPort,並且每個QSerialPort :: write(使用QThread :: msleep)之間存在延遲,並且我想要暫停SerialSender線程直接發送數據而不等待,我想要的是知道是否可以停止QThread :: msleep函數執行? – creekorful