我在进程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);
}
}
答案 0 :(得分:2)
为什么要两次打开同一个活动?
ghEvents[i] = OpenEvent(EVENT_ALL_ACCESS, FALSE, TEXT("Global\\ProducerEvents"));
不应该有两个不同的事件吗?
这与您报告的行为一致
当我真正关闭进程A时, 进程B显示消息框 代替。
因为当您关闭流程A时,会发出相同的事件,表示以WAIT_OBJECT_0 + 0
总而言之,创建两个不同的事件 - 一个用于当进程A关闭而另一个用于表示要显示的消息框。
下面的代码仅适用于i&lt; = 0&lt; = 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);
...
答案 1 :(得分:1)
不是关于case / switch。你试图取消引用无效指针。
答案 2 :(得分:1)
看起来你正试图取消引用HWND,因此崩溃了。
答案 3 :(得分:1)
假设您正在呼叫ThreadFunc
:
ThreadFunc(hwndSomeWindow);
在这种情况下,演员应该是:
unpackedHandle = (HWND) passedHandle;
如果电话是这样的话你的代码是正确的:
ThreadFunc(&hwndSomeWindow);