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;
    }
  • 相关阅读:
    洛谷.3254.圆桌问题(最大流ISAP)
    BZOJ.2639.矩形计算(二维莫队)
    BZOJ.2724.[Violet 6]蒲公英(静态分块)
    BZOJ.4241.历史研究(回滚莫队 分块)
    BZOJ.4542.[HNOI2016]大数(莫队)
    SPOJ.COT2 Count on a tree II(树上莫队)
    BZOJ.3757.苹果树(树上莫队)
    洛谷.2325.[SCOI2005]王室联邦(贪心)
    BZOJ.1299.[LLH邀请赛]巧克力棒(博弈论 Nim)
    HDU.2516.取石子游戏(博弈论 Fibonacci Nim)
  • 原文地址:https://www.cnblogs.com/hcfalan/p/1898472.html
Copyright © 2011-2022 走看看