zoukankan      html  css  js  c++  java
  • PostThreadMessage

    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_MESSAGE,WM_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;
    
    }
    View Code
  • 相关阅读:
    idea最新注册码
    pycharm中可以运行脚本(只在控制台运行,Debugger不运行,设置的断点没用)但是不能debug脚本
    VSCode 云同步扩展设置 Settings Sync 插件
    gist.github.com 无法访问解决办法,亲测永远有效!
    C# HttpWebRequest httpclient
    C# 图片处理
    powerdesigner逆向工程生成PDM时的列注释
    Ocelot网关治理
    Consul服务注册与发现
    CentOS 使用DVD1_DVD2作为本地离线的更新源
  • 原文地址:https://www.cnblogs.com/perfy/p/7216516.html
Copyright © 2011-2022 走看看