Qt由于QWaitCondition导致的事件处理问题

时间:2011-06-17 21:06:01

标签: qt mutex signals signals-slots slot

我正在研究多线程QT项目。主要问题是串行控制器类。该类使用QMutex和QWaitCondition来shyncronize写和读方法。

问题是由于父级中的qwaitcondition等待方法导致子类中的信号被阻塞。等待方法返回后,子类中的信号被emmited(接收者也是子类)。

我认为这种方法(qwaitcondition - wait)会阻止我整个应用程序中的任何信号发射。

问题是这样的:

constructor()
{
    anotherclass = new MyClass;
}
void run()
{
   forever
   {
       if(readmethod())
            waitcondition.wakeall();
   }
}

void method1()
{
      sendpacket();
      mutex.lock();
      if(waitcondition.wait(&mutex,10000))
         //somecode;

      mutex.unlock();
}

class MyClass
{
   someObject sobj;
    MyClass()
    {
        connect(sobj,SIGNAL(somesignal),this,SLOT(someslot));
    }

    void someslot()
    {
        //some code
    }
}

由于超时(在这种情况下为10秒),一旦qwaitcondition返回,我的插槽只调用someslot。

我只想在这个类中使用mutex和qwaitcondition,而不是在整个应用程序中。我试图在主线程中实例化子类,但我有相同的行为。

概念测试

我做了一个测试项目,我在这个链接上发布了它: testwaitconditionproject

测试项目以这种方式工作: 等待条件在父线程中以超时等于10秒为中断。 子线程每2秒发出一次信号,内部插槽必须发出父项捕获的信号。调用父槽后,将标志设置为true。这个标志应该触发一个唤醒来完成de waitcondition。

但不是,孩子的内部信号只在等待条件超时后被触发。这是我的主要问题,父等待条件阻止了我孩子的信号。

修改

我解决了测试项目中的问题,在另一个线程中使用waitcondition调用该方法。我无法复制该问题,因为对方法的异步调用发生在线程1中(通过dbus)。我想知道dbus调用是在线程1中发出的,所以当实例属于同一个线程时,我不会发出子类中的事件。

编辑2:

我解决了我的问题,将pparent和子项放在中间类qthread中。它们在run方法中实例化,并且也使用了exec调用。

1 个答案:

答案 0 :(得分:0)

您似乎没有运行QCoreApplication事件循环,这是处理事件所必需的。在QCoreApplication :: exec()阻止事件循环之前调用write()。而且,似乎在线程内创建具有事件循环的所有QThread对象很重要(如果你想使用来自这些对象的信号)。我有你的例子,创建了另外一个运行pparent的线程(并解锁了QCoreApplication :: exec()),它运行良好。