0

我正在开发一个多线程 QT 项目。主要问题出在串行控制器类上。此类使用 QMutex 和 QWaitCondition 来同步写入和读取方法。

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

我认为这种方法(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 的插槽才会被调用。

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

概念测试

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

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

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

编辑:

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

编辑2:

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

4

1 回答 1

1

您似乎没有运行处理事件所需的 QCoreApplication 事件循环。在 QCoreApplication::exec() 阻塞事件循环之前调用 write()。此外,在具有事件循环的线程内创建所有 QThread 对象似乎很重要(如果您想使用来自此类对象的信号)。我有你的例子,创建了额外的运行 pparent 的线程(并解除阻塞 QCoreApplication::exec()),它运行良好。

于 2011-06-20T08:44:26.427 回答