基本的な紹介
sendEvent メソッドが属するクラスは QCoreApplication であり、完全な宣言は次のとおりです。
[static] bool QCoreApplication::sendEvent(QObject *receiver, QEvent *event)
このメソッドの機能はイベントを公開することでもありますが、postEvent とは異なり、このメソッドはこのスレッド内でイベントを送信するためにのみ使用でき、スレッド間でイベントを公開するために使用することはできません。
Qt ソース コードを分析するのに特に優れたオンライン Web サイトは次のとおりです。
理解する
この方法をどのように理解すればよいでしょうか? 私の個人的な理解では、このメソッドは同期ブロッキング呼び出しです。カーネルのコア実装が直接関数呼び出しを介してイベント配信を実装しているため、同期であると言われます。カーネルのイベント メソッドを待機する必要があるため、ブロッキングであると言われます。受信オブジェクトのイベントメソッドが返さない場合は、永遠に待ちます。
ソースコード分析
inline bool QCoreApplication::sendEvent(QObject *receiver, QEvent *event)
{
if (event)
event->spont = false;
return notifyInternal2(receiver, event);
}
bool QCoreApplication::notifyInternal2(QObject *receiver, QEvent *event)
{
bool selfRequired = QCoreApplicationPrivate::threadRequiresCoreApplication();
……
if (!selfRequired)
return doNotify(receiver, event);
return self->notify(receiver, event);
}
bool QCoreApplication::notify(QObject *receiver, QEvent *event)
{
……
return doNotify(receiver, event);
}
static bool doNotify(QObject *receiver, QEvent *event)
{
……
return receiver->isWidgetType() ? false : QCoreApplicationPrivate::notify_helper(receiver, event);
}
bool QCoreApplicationPrivate::notify_helper(QObject *receiver, QEvent * event)
{
……
return receiver->event(event);
}
上記のコードから、最後の呼び出しがreceiver->event(event)であることがわかります; 明らかに、これは直接関数呼び出しによって実装されています。
使用上のポイント
- sendEvent メソッドを使用すると、ローカル変数またはヒープによって割り当てられた変数を使用できますが、メモリを自分で解放する必要があります。そうしないとメモリ リークが発生します。
- このメソッドは、スレッド間でイベントを送信するために使用されます。
- postEventメソッドで送信されたイベントは、対応するスレッドのイベントキューに送信された後、最終的にsendEventメソッドを呼び出すことでオブジェクトが送信されます。