zoukankan      html  css  js  c++  java
  • 线程通信:Alertable IO

    发现这个在线程等待多个事件,并且是要求所有等待事件触发的情况,唯一可用到退出线程体的一种方式。代码:

    //回调函数,什么也不做
    static void WINAPI ApcFun(ULONG_PTR)
    {
    // do nothing here
    }

    //线程体,等待两个事件Event1, Event2
    DWORD CThreadDemoDlg::ThreadBody()
    {
    m_szOutput.Append(L"Thread started.\r\n");
    PostMessage(WM_USERMSG);

    m_szOutput.Append(L"Waiting for events...\r\n");
    PostMessage(WM_USERMSG);

    HANDLE es[2] = { m_hEvent1, m_hEvent2 };
    DWORD dwResult = 0;

    LBL_WAIT:
      // 注意这里使用的是WaitXXXEx版,最后一个参数标识为Alertable
    dwResult = WaitForMultipleObjectsEx(2, es, TRUE, INFINITE, TRUE);

    if (dwResult >= WAIT_OBJECT_0 && dwResult < (WAIT_OBJECT_0+2))
    { //所有事件被触发
    m_szOutput.Append(L"Events signed.\r\n");
    PostMessage(WM_USERMSG);
    goto LBL_WAIT;
    }

    if (dwResult == WAIT_IO_COMPLETION)
    { //Alertable IO here(after you call QueueUserAPC)
    m_szOutput.Append(L"APC queued.\r\n");
    PostMessage(WM_USERMSG);
    }

    m_szOutput.Append(L"Exiting thread.\r\n");
    PostMessage(WM_USERMSG);

    return 0;
    }

    // Start Thread
    void CThreadDemoDlg::OnBnClickedStartThread()
    {
    if (m_hEvent1 == NULL)
    m_hEvent1 = CreateEvent(NULL, NULL, FALSE, NULL);
    if (m_hEvent2 == NULL)
    m_hEvent2 = CreateEvent(NULL, NULL, FALSE, NULL);
    if (m_hThread)
    {
    CloseHandle(m_hThread);
    m_hThread = NULL;
    }

    m_hThread = CreateThread(NULL, NULL, ThreadRun, this, NULL, NULL);
    }

    // Set Events
    void CThreadDemoDlg::OnBnClickedSetEvent()
    {
    SetEvent(m_hEvent1);
    SetEvent(m_hEvent2);
    }

    // Exit Thread
    void CThreadDemoDlg::OnBnClickedExitThread()
    {
    QueueUserAPC(ApcFun, m_hThread, NULL);
    WaitForSingleObject(m_hThread, 3000);
    CloseHandle(m_hThread);
    m_hThread = NULL;
    }
  • 相关阅读:
    .NET基础 一步步 一幕幕[循环、逻辑语句块]
    .NET 基础 一步步 一幕幕 [注释、命名规则、访问修饰符、数据类型、常量、变量]
    .NET 基础 一步步 一幕幕 [.NET 系列预热]
    .NET 基础 一步步 一幕幕 [前言]
    前端面试题五
    前端面试题四
    ActiveMQ 的客户端选项
    ActiveMq 高级特性的使用
    企业环境中部署 ActiveMQ
    在其他平台上使用 ActiveMQ
  • 原文地址:https://www.cnblogs.com/hcfalan/p/1898472.html
Copyright © 2011-2022 走看看