我在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代码在事件最终退出之前已经创建了该事件,但尚未发出信号吗?