• 线程通信: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;
    }
  • 相关阅读:
    小程序配置 全局配置
    浅谈 Nginx和LVS的各种优缺点
    LVS负载均衡(LVS简介、三种工作模式、十种调度算法)
    用Camshift算法对指定目标进行跟踪
    AsyncTask源代码解析
    shell中的${},##和%%的使用
    hdu 1081 &amp; poj 1050 To The Max(最大和的子矩阵)
    POJ 1141 Brackets Sequence (区间DP)
    Ejb in action(六)——拦截器
    7.JAVA编程思想笔记隐藏实施过程
  • 原文地址:https://www.cnblogs.com/hcfalan/p/1898472.html
Copyright © 2020-2023  润新知