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