イベントと WaitForSingleObject をテストするために、Windows 10 64 ビットの Visual Studio 2017 で 2 つの小さなテスト アプリケーションを作成しました。
intervalzero の RTX リアルタイム拡張機能も使用しています。
私のアプリケーションの 1 つは、Windows 部分の x64 コードで記述され、もう 1 つは RTX サブシステムの x64 コードで記述されています。
ここで私の考えは、RTX 64 内からイベントを作成し、シグナル間の特定の一時停止時間で 10 回シグナルを送信することでした。
int _tmain(int argc, _TCHAR * argv[])
{
RtPrintf("Starte RTX-Applikation\n");
RtSleep(0);
HANDLE hEvent = RtCreateEvent(NULL, false, false, _T("flexLZSStart"));
if (hEvent != INVALID_HANDLE_VALUE)
{
RtPrintf("Event erzeugt\n");
for (size_t i = 0; i < 10 ; i++)
{
RtSetEvent(hEvent);
RtPrintf("Event gesetzt\n");
RtSleep(1500);
}
RtCloseHandle(hEvent);
}
RtPrintf("exit process\n");
return 0;
}
一方、Windows アプリケーションはイベントの作成をチェックし、イベントが通知されているかどうかを繰り返しチェックします。
int main()
{
Sleep(150);
HANDLE hEvent = NULL;
DWORD dwstart = GetTickCount();
printf("wait for creation of event\n");
while (hEvent == NULL)
{
hEvent = RtOpenEvent(NULL, NULL, _T("flexLZSStart"));
}
if ((hEvent == INVALID_HANDLE_VALUE) || (hEvent == NULL))
{
exit(-2);
}
//#define REOPEN
if ((hEvent != INVALID_HANDLE_VALUE) && (hEvent != NULL))
{
DWORD dwErg;
BOOLEAN aborted = false;
printf("Event has been created.\n");
#ifdef REOPEN
RtCloseHandle(hEvent);
#endif
do
{
printf("Wait for event to be signaled\n");
#ifdef REOPEN
hEvent = RtOpenEvent(NULL, NULL, _T("flexLZSStart"));
if (hEvent == NULL)
{
printf("Event has been disposed?\n");
break;
}
#endif
dwErg = RtWaitForSingleObject(hEvent,1000);
#ifdef REOPEN
RtCloseHandle(hEvent);
#endif
DWORD dwLastError = GetLastError();
if (dwLastError != 0)
{
printf("GetLastError returned %d!\n", dwLastError);
}
switch (dwErg)
{
case WAIT_OBJECT_0:
printf("received Event\n");
RtResetEvent(hEvent);
break;
case WAIT_TIMEOUT:
//printf("event not yet received\n");
break;
case WAIT_ABANDONED:
{
printf("owner of event has been killed\n");
aborted = true;
}
break;
default:
{
printf("no valid return value: %d\n", dwErg);
aborted = true;
}
break;
}
} while (!aborted);
}
printf("loop exited\n");
exit(0);
}
私の観察では、RTX コードは問題なく実行され、イベントを 10 回通知した後に終了します。
一方、Windows コードはイベントを 10 回受け取りますが、rtx アプリケーションがいつイベントを閉じたかを検出しません。
コードをREOPEN
定義済みでコンパイルすると、Windows コードは使用できなくなったため、イベントのオープンで終了します。
Windows コードが作業を完了するまで rtx コードが待機するように、最初のイベントを受け取った後に Windows コードによってトリガーされる 2 番目のイベントを作成して、コードを拡張する必要があります。
しかし、私の最後の質問は次のとおりです。
イベントのソースがまだ有効かどうかを検出する適切な方法は何ですか?
最終的に終了する前に、rtx コードがイベントを作成したが、まだ通知していないことを検出できますか?