我想知道是否有取消暫停睡眠線程的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. 在Java中按鍵時暫停/取消暫停線程
- 4. 暫停消息框的線程
- 5. 如何在主線程停止/暫停線程/ Activity在android中暫停/停止?
- 6. 線程暫停
- 7. Qt,如何暫停QThread
- 8. jquery simplyscroll觸發暫停/取消暫停
- 9. 暫停和取消暫停AS2動畫
- 10. 如何停止暫停藍牙讀取的線程
- 11. Qt應用程序暫停
- 12. pthread - 暫停/暫停所有線程
- 13. 主線程暫停
- 14. Ruby暫停線程
- 15. 暫停和停止線程
- 16. 氣流取消暫停DAG編程?
- 17. 如何在javascript中暫停UI線程
- 18. Swift iOS如何暫停線程
- 19. 如何暫停主u.i線程(Android)
- 20. 如何暫停一個線程(python)
- 21. 如何暫停執行線程
- 22. 如何暫停和恢復線程
- 23. PyCharm - 如何暫停所有線程
- 24. 如何在java中暫停線程?
- 25. 如何暫停一個線程?
- 26. 如何暫停和恢復surfaceView線程
- 27. 如何暫停和恢復線程?
- 28. POSIX:我如何暫停線程?
- 29. 你如何暫停一個線程?
- 30. 如何暫停計時器線程
你能爲你的問題更多的情況下,要做到這一點,爲什麼呢?你是否試圖並行運行兩個線程訪問相同的資源?如果是這樣,只是使用互斥體,你什麼意思是「在時間用完之前」,這是非常大的,因爲它看起來 – Alex
看看'QMutex'和'QWaitCondition' – deW1
我有一個名爲SerialSender(QThread的實現)數據使用QSerialPort,並且每個QSerialPort :: write(使用QThread :: msleep)之間存在延遲,並且我想要暫停SerialSender線程直接發送數據而不等待,我想要的是知道是否可以停止QThread :: msleep函數執行? – creekorful