我有两个线程,假设线程“A”和线程“B”。线程“A”发布自定义QEvent到线程“B”,然后它应该等到线程“B”处理这个事件。
到目前为止我做了什么:
我的活动课程:
class IPCMessageEvent : public QEvent
{
public:
IPCMessageEvent(QWaitCondition* pConditions) : QEvent(IPC_MESSAGE_RECEIVED)
, mpWaitCondition(pConditions)
{ };
~IPCMessageEvent()
{
mpWaitCondition->wakeOne();
};
private:
QWaitCondition* mpWaitCondition;
};
我的线程“A”:
QWaitCondition recvCondition;
IPCMessageEvent* pEvent = new IPCMessageEvent(&recvCondition);
QCoreApplication::postEvent(gpApp, pEvent);
QMutex mutex;
mutex.lock();
recvCondition.wait(&mutex, IPC_MESSAGE_WAIT_TIMEOUT);
我的线程“B”:处理接收到的事件并销毁它。~IPCMessageEvent析构函数被调用,因此wakeOne()
将为recvCondition
in 线程“A”启动。
一切似乎都很好,这只是一件事!看起来有时~IPCMessageEvent的调用时间比预期的要早...
QCoreApplication::postEvent(gpApp, pEvent);
<---- pEvent is already destroyed here ---->
QMutex mutex;
mutex.lock();
所以我的recvCondition.wait(&mutex, IPC_MESSAGE_WAIT_TIMEOUT);
将被锁定并会达到超时。
还有其他方法可以进行这种同步吗?或者也许有人对如何解决/克服这个问题有任何建议?