两个线程,主线程和用AfxBeginThread方式起的线程,其中AfxBeginThread的第一个参数是RUNTIMECLASS类CMyThread(从CWinThread中派生的线程类)。
在主线程中的一个对话框中点击一个Button,每点击一次,PostThreadMessage一次,
用的函数为::PostThreadMessage(Thread_id, ID_MEG, 0, (LPARAM)&sendmesgtrue),而ID_MEG对应的消息处理函数为CMyThread的StartBill(WPARAM wParam, LPARAM lParam)函数。此函数中用了一个大的for循环来模拟耗时长的操作,当连续点击三次主线程中的对话框中Button时,产生的消息为1,2,3,发现StartBill收到的消息不对,为1,3,3。为什么?详细程序如下:
主线程中的点击对话框的button产生的动作:
void CMy3DButtonDlg::On3dtestbtn() 
{
CString sendmsg;
kkk++;                       //kkk为static int 型变量
sendmsg.Format("btn click is %d\n",kkk);
TRACE(ttt);                  //用于在debug中跟踪变量值
wsprintf(sendmsgtrue,sendmsg);//sendmsgtrue为主线程中的全局变量
::PostThreadMessage(Thread_id, ID__MEG, 0, (LPARAM)&sendmsgtrue);                              //Thread_id为新线程的threadid

}
派生线程中处理ID__MEG的函数:
LRESULT CMyThread::StartBill(WPARAM wParam, LPARAM lParam)
{
char *myrec;
myrec=(char*)lParam;
CString ok;
ok="res";
ok+=mysen;
for(int i=0;i<1000000000;i++);
TRACE(ok);
return 0;
}
连续三次点击button产生btn click is 1,btn click is 2,btn click is 3三条语句
StartBill中Trace出的语句为resbtn click is 1,resbtn click is 3,resbtn click is 3.那么2为什么变成了3?我用该例子主要为了测试在发消息的线程中需要频繁的发消息,而接收消息的函数每次处理一个消息需费时很长的情况。如果上面的方法不好,哪位高手有比较好的方法?

解决方案 »

  1.   

    输出正常,比如产生btn click is 1,btn click is 2,btn click is 3三条语句,则StartBill中Trace出的语句为resbtn click is 1,resbtn click is 2,resbtn click is 3。
    其实,只要for次数小一点,输出也正常,可是我不明白为什么会这样。
      

  2.   

    postthreadmessage()不是阻塞调用,导致的线程不同步,每次都应该新分配一块内存区域放参数。
    。char *psendmsgtrue=new char[xxxx];
    strcpy(psendmsgtrue,sendmsgtrue,xxxx);
    ::PostThreadMessage(Thread_id, ID__MEG, 0, (LPARAM)psendmsgtrue); 
    。。然后在线程里delete[] psendmsgtrue;
      

  3.   

    主要是post那个函数是异步的。解决方法同上。