切换语句用法 - C.

时间:2010-04-30 12:35:20

标签: c winapi events switch-statement

我在进程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发送数据时抛出错误(当我注释掉解包时):

Error Image

我是否错误地实现了我的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); 
                } 
        }

4 个答案:

答案 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);