メッセージキューを作成するために Getmessage() の前に peekMessage ステートメントが必要なのはなぜですか?
3 に答える
必須ではありません。
ただし、メッセージを処理する準備がまだ整っていないスレッドが、メッセージ キューでメッセージを受信できるようにする必要がある場合があります。新しいスレッドはすぐにメッセージ キューを持ちませんがPeekMessage
、メッセージ キューを作成するには呼び出しで十分です。メッセージがないため、すぐに戻ります。これにより、スレッドは準備を続けることができます。その間、他のスレッドは新しいスレッドのメッセージのキューイングを開始できます。新しいスレッドの準備が整うとGetMessage
、キューから最初のメッセージを取得するか、メッセージがキューに入れられるのを待つために呼び出します。
そうではありません。2つの関数は異なることをします。
PeekMessage(...)は、メッセージが表示されるのを待ちません。メッセージが表示されている場合は最初のメッセージを取得し、オプションでキューからも削除しますが、メッセージがない場合はすぐにfalseを返します。これは、メッセージを待っている間に何らかの処理を行っているアプリでより一般的であり、ただそこに座って次のメッセージを永遠に待つことはできません。リアルタイムゲームなどは簡単にこのカテゴリに分類されます。
GetMessage(...)は、メッセージが表示されるまで待機し、メッセージを取得します。CPUに関してはより効率的であり、常にポーリングしているわけではありませんが、メッセージがない場合は一時停止します。これは、一定のリアルタイム処理を実行する必要のないformyアプリやその他のプログラムでより一般的です。
PeekMessage
の前/代わりに使用する理由は複数ありますGetMessage
。
- メッセージが到着するまでプログラムがハングしないようにする - これは少し冗長です。これはフラグを直接使用
PeekMessage
しPM_REMOVE
てメッセージ キューをポーリングし、GetMessage
完全に除外できるためです。 - 関数を使用して
PM_NOREMOVE
、キューからメッセージを処理および/または削除するかどうかを決定します。 IsWindowUnicode
返されたメッセージのウィンドウ ハンドルを呼び出し、 または のいずれPeekMessageA
かを選択しますPeekMessageW
。- 上記の倍数。