代码之家  ›  专栏  ›  技术社区  ›  Jamie Keeling

Switch语句用法-C

  •  0
  • Jamie Keeling  · 技术社区  · 14 年前

    我在进程B上有一个线程函数,它包含一个开关,用于根据进程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应该显示一个简单的消息框,如果第二个数组发出信号,应用程序应该关闭。

    此外,进程B发送数据时抛出错误(当我注释掉解包时):

    Error Image

    谢谢你的时间。

    Here

    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 回复  |  直到 7 年前
        1
  •  2
  •   Jorge Ferreira    14 年前

    为什么你要两次开同一个活动?

    ghEvents[i] = OpenEvent(EVENT_ALL_ACCESS, FALSE, TEXT("Global\\ProducerEvents"));
    

    不应该有两个不同的事件吗?

    当我关闭一个进程时, 进程B显示消息框 相反。

    因为当你关闭一个进程的时候,同样的事件也会作为一个信号进入开关 WAIT_OBJECT_0 + 0

    总之,创建两个不同的事件—一个用于进程A关闭时,另一个用于向要显示的消息框发送信号。

    但要点是循环迭代必须创建一个具有不同名称的事件。

    过程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);
        ...
    
        2
  •  1
  •   Andrey    14 年前

        3
  •  1
  •   Alex Budovski    14 年前

    看起来你在尝试取消对HWND的引用,因此导致了崩溃。

        4
  •  1
  •   Adrian McCarthy    14 年前

    假设你在打电话 ThreadFunc

    ThreadFunc(hwndSomeWindow);
    

    unpackedHandle = (HWND) passedHandle;
    

    ThreadFunc(&hwndSomeWindow);