スレッド「A」とスレッド「B」の2つのスレッドがあります。「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デストラクタが呼び出されるため、スレッド「A」内でwakeOne()
開始されます。recvCondition
すべてがうまく機能しているようです、それはただ1つのことです!〜IPCMessageEventが予想よりも早く呼び出されることがあるようです...
QCoreApplication::postEvent(gpApp, pEvent);
<---- pEvent is already destroyed here ---->
QMutex mutex;
mutex.lock();
だから私recvCondition.wait(&mutex, IPC_MESSAGE_WAIT_TIMEOUT);
はロックされてタイムアウトになります。
この種の同期を行う他の方法はありますか?または、誰かがこの問題を修正/克服する方法について何か提案がありますか?