0

Klein の C++ 用シリアル ライブラリの例を理解するのに苦労しています。このページの中ほどに、「Win32 同期オブジェクトの使用」というセクションがありますが、これを理解するのに苦労しています。 http://www.codeproject.com/Articles/992/Serial-library-for-C

// Create a handle for the overlapped operations
HANDLE hevtOverlapped = ::CreateEvent(0,TRUE,FALSE,0);;

// Open the "STOP" handle
HANDLE hevtStop = ::CreateEvent(0,TRUE,FALSE,_T("Overlapped_Stop_Event"));

// Setup the overlapped structure
OVERLAPPED ov = {0};
ov.hEvent = hevtOverlapped;

// Wait for an event
serial.WaitEvent(&ov);

// Setup array of handles in which we are interested
HANDLE ahWait[2];
ahWait[0] = hevtOverlapped;
ahWait[1] = hevtStop;

// Wait until something happens
switch (::WaitForMultipleObjects(2,ahWait,FALSE,INFINITE))
{
case WAIT_OBJECT_0:
    // Serial port event occurred
    ...

case WAIT_OBJECT_0+1:
    // Stop event raised
    ...
}

その呼び出しから WaitEvent が実行するものは次のとおりです(すべてのチェックなどはありません):

// Wait for the COM event
::WaitCommEvent(m_hFile,LPDWORD(&m_eEvent),lpOverlapped);

::SetEvent(lpOverlapped->hEvent);

2 つの質問: 1) シリアル クラスの WaitEvent メソッドと、その直後に Windows API の WaitForMultipleObjects の両方を使用するのはなぜですか? どちらも同じことをしているように見えます: COM ポートで何かが起こるのを待ちます。2) Stop イベントはどのように通知されますか? WaitForMultipleObjects は名前か何かでそれを認識しますか?

4

1 に答える 1

2

このコードは、非同期関数の形式であるオーバーラップ I/O を使用しているため、 への呼び出しWaitCommEvent()は、シリアル イベントが発生するのを実際には待機しませんが、代わりに、興味深いイベントが発生したときに、指定されたイベント オブジェクトに通知します。

WaitForMultipleObjects、指定された 2 つのイベント オブジェクトのいずれかがシグナル状態になるまで待機します。

  1. 最初のものは、WaitCommEvent()何か興味深いものを検出したときに設定されます。
  2. 2 つ目は、このコードにはそれをトリガーする方法がないため、ご想像のとおり、おそらく名前で、このイベントを通知するプログラム内の別の部分があると思います。
于 2015-03-08T20:17:13.547 に答える