我正在开发一个多线程 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 调用。