c - Switch 语句用法 - C

标签 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); 
                } 
        }

最佳答案

为什么要两次打开同一个事件?

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/

相关文章:

C:子范围内的反向数组

c - 如何将从文件中获取的 2-3 位数字放入数组中?

c - C 中的 atoi 函数无法正常工作(超过某个值时)

javascript - 单击一个时,如何使 Google map 中的多个重叠标记打开自己的信息窗口

c - 读/写结构到套接字

winapi - 在 Windows Vista 和 Windows 7 上使用 HEAP_NO_SERIALIZE 的堆内存函数速度减慢约 100 倍的原因

c++ - 查找符号链接(symbolic link)指向的位置 (Windows)

c++ - 位于字符串加密密码中的断点

javascript - 单击按钮上的图标-字体-图标(有时是文本)时,Backbone.js 事件不会触发

java - build 迷宫