WaitForSingleObject和事件,行为不清楚

时间:2018-12-12 08:07:35

标签: c++ c windows 64-bit rtx

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

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

我的一个应用程序是用Windows的x64代码编写的,另一个应用程序是用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事件代码将在事件打开11时退出,因为该事件不再可用。

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

但是我的最后一个问题是:

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

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

0 个答案:

没有答案