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;
    }
  • 相关阅读:
    SpringBoot jar包不支持jsp
    Spring Boot 启动报错:LoggingFailureAnalysisReporter
    spring boot与spring mvc的区别是什么?
    解决配置JAVA_HOME JDK版本不变的问题
    Linux下修改Mysql的用户(root)的密码
    CentOS/Linux 解决 SSH 连接慢
    Linux查看进程的所有子进程和线程
    Linux命令之pstree
    使用awk批量杀进程的命令
    lucene 自定义评分
  • 原文地址:https://www.cnblogs.com/hcfalan/p/1898472.html
Copyright © 2011-2022 走看看