0

イベントと 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 コードがイベントを作成したが、まだ通知していないことを検出できますか?

4

1 に答える 1

0

両方のアプリケーションをプログラムした方法が原因で、送信者が終了したことを検出する方法がありません。

これを検出するには、送信者が終了したときに起動される別のミューテックスを実装する必要がありました。そのため、レシーバーはシグナルされたミューテックスを検出し、自分自身を終了できます。

于 2022-02-24T21:07:15.990 に答える