我在进程 B 上有一个线程函数,它包含一个开关,用于根据从进程 A 发送的事件的结果执行某些操作,这些作为数组中的两个元素存储。
我将第一个元素设置为指示进程 A 何时有数据要发送的事件,我将第二个元素设置为指示进程 A 何时关闭的事件。
我已经开始实现 switch 语句的功能,但没有得到预期的结果。
考虑以下几点:
//Thread function
DWORD WINAPI ThreadFunc(LPVOID passedHandle)
{
for(i = 0; i < 2; i++)
{
ghEvents[i] = OpenEvent(EVENT_ALL_ACCESS, FALSE, TEXT("Global\\ProducerEvents"));
if(ghEvents[i] == NULL)
{
getlasterror = GetLastError();
}
}
dwProducerEventResult = WaitForMultipleObjects(
2,
ghEvents,
FALSE,
INFINITE);
switch (dwProducerEventResult)
{
case WAIT_OBJECT_0 + 0:
{
//Producer sent data
//unpackedHandle = *((HWND*)passedHandle);
MessageBox(NULL,L"Test",L"Test",MB_OK);
break;
}
case WAIT_OBJECT_0 + 1:
{
//Producer closed
ExitProcess(1);
break;
}
default:
return;
}
}
如您所见,如果第一个数组中的事件已发出信号,进程 B 应显示一个简单的消息框,如果第二个数组中的事件已发出信号,则应用程序应关闭。
当我实际关闭进程 A 时,进程 B 会显示消息框。
如果我将第一个案例留空(什么都不做),两个应用程序都会按预期关闭。
此外,进程 B 发送数据时抛出错误(当我注释掉解包时):
我是否错误地执行了 switch 语句?我虽然也正确地处理了 HWND 的解包,有什么建议吗?
感谢您的宝贵时间。
编辑:
我下面的例子:Here
进程A中的事件创建:
for (i = 0; i < 2; i++)
{
ghEvents[i] = CreateEvent(
NULL, // default security attributes
TRUE, // auto-reset event object
FALSE, // initial state is nonsignaled
TEXT("Global\\ProducerEvents")); // unnamed object
if (ghEvents[i] == NULL)
{
printf("CreateEvent error: %d\n", GetLastError() );
ExitProcess(0);
}
}
最佳答案
为什么要两次打开同一个事件?
ghEvents[i] = OpenEvent(EVENT_ALL_ACCESS, FALSE, TEXT("Global\\ProducerEvents"));
不应该有两个不同的事件吗?
这与您报告的行为一致
When I actually close Process A, Process B displays the message box instead.
因为当您关闭进程 A 时,会发出相同的事件信号,该事件作为 WAIT_OBJECT_0 + 0
总而言之,创建两个不同的事件 - 一个用于进程 A 何时关闭,另一个用于指示要显示的消息框。
下面的代码只适用于 i <= 0 <= 9 但要点是循环迭代必须创建一个具有不同名称的事件。
进程A:
LPTSTR eventName[] = _T("Global\\ProducerEventi");
for (i = 0; i < 2; i++)
{
eventName[20] = '0' - i; // this will change last i character with '0' or '1'
ghEvents[i] = CreateEvent(NULL, TRUE, FALSE, eventName);
...
进程 B:
LPTSTR eventName[] = _T("Global\\ProducerEventi");
for(i = 0; i < 2; i++)
{
eventName[20] = '0' - i; // this will change last i character with '0' or '1'
ghEvents[i] = OpenEvent(EVENT_ALL_ACCESS, FALSE, eventName);
...
关于c - Switch 语句用法 - C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2744498/