2011-12-30 78 views
0

現在在Qt中,我遇到了有兩個線程有​​兩個不同對象的問題。這些對象不是QObject,因此它們不能使用信號/插槽進行通信。第一個線程是主線程,第二個線程處於無限循環,它使用隊列處理命令對象。同步Qt中不同線程中的對象

主線程必須等待處理線程完成請求。

如何在不使用全局互斥和等待條件的情況下同步兩個不同的線程?

+0

我正確理解你有這樣的情況:Thread1接收數據並將它傳遞給Thread2進行處理,並在讀取下一個數據之前等待Thread2完成? – Karlson 2011-12-30 17:57:09

+0

耶正是這種情況,但同步是一個問題,因爲信號/插槽不是一個選項 – Anonymous 2011-12-30 22:02:42

+0

如果thread1不移動,直到thread2完成處理數據它剛剛收到爲什麼你需要多線程?所有你需要的是Receive-> Process – Karlson 2011-12-30 22:16:21

回答

2

您可以使用互斥鎖。每次從隊列中拉出「請求」時鎖定,並在每次要追加到隊列時鎖定。這樣,你可能有

是這樣的:

#include <QMutex> 
#include <QWaitCondition> 

class processingThread 
{ 
public: 
    void appendToQueue(Request req) 
    { 
     sync.lock(); 
     queue.append(req); 
     sync.unlock(); 
     cond.wakeAll();    
    } 

protected: 
    void run() 
    { 
     while(1) 
     { 
      sync.lock(); 
      QWaitCondition wait(&sync); 
      Request current = queue.takeFirst(); 

      // process request 

      sync.unlock() 
     } 
    } 

private: 
    QList<Request> queue; 
    QMutex sync; 
    QWaitCondition cond; 
}; 

現在,您可以從任何線程調用processingThread :: appendToQueue並獲得同步數據。您可以使用此模式同步線程中的任何數據。只要記住要鎖定對想要同步的數據的訪問權限。請注意,QWaitCondition僅用於使您的線程僅在需要時才能工作

+0

我認爲使用QWaitCondition是最好的選擇。在我的解決方案中,我讓這兩個線程訪問單個對象,然後他們能夠使用QMutex和WaitCondtion進行同步。當我解決了我的問題後,我會發布示例代碼的快照。 – Anonymous 2011-12-30 23:16:35

0

您的命令對象可以包含「同步」對象,因此發件人可以等待此對象,並且處理器線程可以在完成時發出信號。同步對象只需要一個布爾值和一個QWait條件,它不應該是全局的。