MFC-PostThreadMessage向指定线程发送消息

发布时间 2023-03-23 08:26:39作者: 天子骄龙

#define WM_MyMessage (WM_USER+100)  //自定义消息号

UINT funcw(LPVOID pParam) //写线程
{
    DWORD ID = (DWORD)pParam; //获取读线程ID
    int n = 0;
    for (int i=0;i<1000;i++)
    {
        n = n + 2;
        BOOL b=PostThreadMessage(ID, WM_MyMessage,n,NULL); //将一个队列消息放入(寄送)到指定线程的消息队列里
        /*
        PostThreadMessage可以用于线程之间的异步通讯,不等待线程处理消息就返回
        参数1:DWORD 目标线程ID
        参数2:UINT消息号(消息的类型)
        参数3:WPARAM 指定附加的消息特定信息
        参数4: LPARAM 指定附加的消息特定信息
        返回值:如果函数调用成功,返回非零值。如果函数调用失败,返回值是零。
        若想获得更多的错误信息,请调用GetLastError函数。
        如果idThread不是一个有效的线程标识符或由idThread确定的线程没有消息队列,GetLastError返回ERROR_INVALID_THREAD_ID
        */
        Sleep(1000);

    }
          
    return 100;
}

UINT funcr(LPVOID pParam)
{
    
    //从消息队列里获取写线程发送过来的消息
    MSG msg = { 0 };
    while (GetMessage(&msg, NULL, 0, 0))
    {
        switch (msg.message)
        {
        case WM_MyMessage:   //根据消息号进行判断
            int n = (int)msg.wParam;
            CString str;
            str.Format(_T("n=%d\r\n"),n);
            ::OutputDebugString(str);
            break;

        }
    }
    
        
    

    return 200;
}


void Cduoxiancen2Dlg::OnBnClickedButton1()
{
    // TODO: 在此添加控件通知处理程序代码
    
        
    CWinThread* pp1 = AfxBeginThread(funcr, NULL); //读线程
    pp1->m_nThreadID;//当前线程的 ID

    CWinThread* pp = AfxBeginThread(funcw, (LPVOID)pp1->m_nThreadID);//写线程
    //传递的参数是读线程的ID
    //功能:写线程的变量值发生变化后,就发送消息告诉读线程



}