現在在Qt中,我遇到了有兩個線程有兩個不同對象的問題。這些對象不是QObject,因此它們不能使用信號/插槽進行通信。第一個線程是主線程,第二個線程處於無限循環,它使用隊列處理命令對象。同步Qt中不同線程中的對象
主線程必須等待處理線程完成請求。
如何在不使用全局互斥和等待條件的情況下同步兩個不同的線程?
現在在Qt中,我遇到了有兩個線程有兩個不同對象的問題。這些對象不是QObject,因此它們不能使用信號/插槽進行通信。第一個線程是主線程,第二個線程處於無限循環,它使用隊列處理命令對象。同步Qt中不同線程中的對象
主線程必須等待處理線程完成請求。
如何在不使用全局互斥和等待條件的情況下同步兩個不同的線程?
您可以使用互斥鎖。每次從隊列中拉出「請求」時鎖定,並在每次要追加到隊列時鎖定。這樣,你可能有
是這樣的:
#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僅用於使您的線程僅在需要時才能工作
我認爲使用QWaitCondition是最好的選擇。在我的解決方案中,我讓這兩個線程訪問單個對象,然後他們能夠使用QMutex和WaitCondtion進行同步。當我解決了我的問題後,我會發布示例代碼的快照。 – Anonymous 2011-12-30 23:16:35
您的命令對象可以包含「同步」對象,因此發件人可以等待此對象,並且處理器線程可以在完成時發出信號。同步對象只需要一個布爾值和一個QWait條件,它不應該是全局的。
我正確理解你有這樣的情況:Thread1接收數據並將它傳遞給Thread2進行處理,並在讀取下一個數據之前等待Thread2完成? – Karlson 2011-12-30 17:57:09
耶正是這種情況,但同步是一個問題,因爲信號/插槽不是一個選項 – Anonymous 2011-12-30 22:02:42
如果thread1不移動,直到thread2完成處理數據它剛剛收到爲什麼你需要多線程?所有你需要的是Receive-> Process – Karlson 2011-12-30 22:16:21