WaitForSingleObject и Events, непонятное поведение

Я написал два небольших тестовых приложения для 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. open события, потому что он больше не доступен.

Я должен улучшить свой код, имея второе событие, которое запускается кодом Windows после получения первого события, так что код RTX ждет, пока код Windows не завершит свою работу.

Но мой последний вопрос:

Как правильно определить, является ли источник события действительным?

Могу ли я обнаружить, что код rtx создал событие, но еще не сигнализировал его, прежде чем оно в конечном итоге завершилось?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]