zoukankan      html  css  js  c++  java
  • 使用Windows API PostThreadMessage进行线程间消息通信

    使用Windows API PostThreadMessage进行线程间消息通信

    相信好多人都听过这个Windows APIPostThreadMessage,今天终于有时间来详细的研究一下,据我所知好多的公司在面试的时候都会提到这个API,因为常写代码的人一定会知道这个API,通过这个提问,可以考察一个人对细节的掌握程度。不多说了,开始正题。

    如下函数原型From MSDN:

    BOOL WINAPI PostThreadMessage(_In_ DWORD idThread,_In_ UINT Msg,_In_ WPARAM wParam,_In_ LPARAM lParam);

    idThread -      [in] Type: DWORD The identifier of the thread to which the message is to be posted.

    Msg     -       [in] Type: UINT The type of message to be posted.

    wParam -        [in] Type: WPARAM Additional message-specific information.

    lParam -        [in] Type: LPARAM Additional message-specific information.

    也就是说为了使用这个API我们只要提供接受线程的线程ID以及相应的参数就行了,如下是代码实现,首先创建worker thread 并且在worker thread中创建消息循环,这样当我们在主线程中PostThreadMessage的时候worker thread就可以对进来的消息进行处理了,我们可以给worker thread发送TALK_MESSAGEWM_QUIT message, 一旦worker thread收到WM_QUIT message, worker thread将报告给主线程自己要退出了,然后结束自己的生命周期。

    DWORD ThreadProc(LPVOID lParam)

    {

            MSG msg;

            while(GetMessage(&msg,0,0,0))

            {

                    if(msg.message == TALK_MESSAGE)

                    {

                            MessageBox(NULL,L"Hi",L"Worker Thread",MB_OK);

                    }

                    DispatchMessage(&msg);

            }

            MessageBox(NULL,L"Thread will close by pressing OK",L"From Worker Thread",MB_OK);

            AfxGetApp()->m_pMainWnd->PostMessageW(TALK_MESSAGE+1,0,0);

            return 0;

    }

    void CPostThreadMSGDlg::OnBnClickedOk()

    {

            CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadProc,0,0,&m_dwThread);

            ::MessageBox(NULL,L"Worker Thread Created!",L"From main Thread",MB_OK);

            OnOK();

    }

    void CPostThreadMSGDlg::OnBnClickedButtonHi()

    {

            PostThreadMessage(m_dwThread,TALK_MESSAGE,0,0);

    }

    void CPostThreadMSGDlg::OnBnClickedButtonCllose()

    {

            PostThreadMessage(m_dwThread,WM_QUIT,0,0);

    }

    LONG CPostThreadMSGDlg::OnWorkerThreadQuitFunction(WPARAM wParam, LPARAM lParam)

    {      

            ::MessageBox(NULL,L"Main thread have known Worker Thread died!",L"From main Thread",MB_OK);

            return 0;

    }

    总结

    本文详细解释了使用Windows API PostThreadMessage进行线程间消息通信的过程,给出了示例代码,并且对示例代码的运行原理进行的说明,相信通过本文的介绍大家会对这个API有深刻的印象。

     

  • 相关阅读:
    TinyMCE 官方插件一览表(不完全)
    关于在线编辑器的选择:tinymce
    file_put_contents 错误:failed to open stream: Invalid argument 一种原因
    QQ拼音输入法 该到放弃的时候了
    Apache 配置屏蔽某些请求头
    apache EnableMMAP指令
    xwamp 目录结构设计
    Windows服务器如何选 搭建WAMP环境
    Windows安装apache2.4
    自己动手打造WEB服务器 Windows + Apache + PHP + MySQL
  • 原文地址:https://www.cnblogs.com/pugang/p/2654278.html
Copyright © 2011-2022 走看看