#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 //功能:写线程的变量值发生变化后,就发送消息告诉读线程 }