同步Qt中不同线程中的对象

同步Qt中不同线程中的对象

问题描述:

现在在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

您可以使用互斥锁。每次从队列中拉出“请求”时锁定,并在每次要追加到队列时锁定。这样,你可能有

是这样的:

#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

您的命令对象可以包含“同步”对象,因此发件人可以等待此对象,并且处理器线程可以在完成时发出信号。同步对象只需要一个布尔值和一个QWait条件,它不应该是全局的。