2016-09-30 154 views
0

我想知道是否有取消暫停睡眠線程的Qt
我使用的QThread :: msleep(MS)函數
暫停線程的方式,我想之前取消暫停線程時間用完
有什麼辦法可以做到嗎?所有的
如何取消暫停線程的Qt

+0

你能爲你的問題更多的情況下,要做到這一點,爲什麼呢?你是否試圖並行運行兩個線程訪問相同的資源?如果是這樣,只是使用互斥體,你什麼意思是「在時間用完之前」,這是非常大的,因爲它看起來 – Alex

+3

看看'QMutex'和'QWaitCondition' – deW1

+0

我有一個名爲SerialSender(QThread的實現)數據使用QSerialPort,並且每個QSerialPort :: write(使用QThread :: msleep)之間存在延遲,並且我想要暫停SerialSender線程直接發送數據而不等待,我想要的是知道是否可以停止QThread :: msleep函數執行? – creekorful

回答

4

首先,如果你使用QSerialPort,你真的不必亂用線程。你應該異步處理它。因此,您在連接到readyRead()信號的插槽中使用read(),並且如果您希望在寫入之間有一些延遲,請使用QTimerwrite()連接到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