0

我在 Windows 10 64 位上使用 Visual Studio 2017 编写了两个小测试应用程序,我想用它们测试事件和 WaitForSingleObject。

我也在使用来自 intervalzero 的 RTX 实时扩展。

我的一个应用程序是用 x64 代码为 windows 部分编写的,另一个是用 x64 代码为 RTX 子系统编写的。

现在我的想法是从 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 代码会在 11. 打开事件时退出,因为它不再可用。

我应该通过第二个事件来增强我的代码,该事件由 windows 代码在收到第一个事件后触发,以便 rtx 代码等到 windows 代码完成其工作。

但我的最后一个问题是:

检测事件源是否仍然有效的正确方法是什么?

我可以检测到 rtx 代码在它最终退出之前已经创建了事件,但还没有发出信号吗?

4

1 回答 1

0

由于我对两个应用程序的编程方式,无法检测到发件人已结束。

为了检测到这一点,我应该实现另一个在发送者退出时触发的互斥锁。因此接收器可以检测到信号互斥体并自行退出。

于 2022-02-24T21:07:15.990 回答