WaitForSingleObject и Events, непонятное поведение - PullRequest
0 голосов
/ 12 декабря 2018

Я написал два небольших тестовых приложения для Visual Studio 2017 на 64-битной Windows 10, с помощью которых я хотел протестировать Events и WaitForSingleObject.

Я также использую RTX-расширения реального времени от intervalzero.

Одно из моих приложений написано в коде 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 создал событие, но еще не сигнализировал его до того, как оно в конце концов завершилось?

...