您的位置:程序门 -> vc/mfc -> 进程/线程/dll



线程里怎么发送消息?为什么我发的消息没有反应???


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


线程里怎么发送消息?为什么我发的消息没有反应???[已结贴,结贴人:kenny9931]
发表于:2007-07-10 14:27:26 楼主
线程里怎么发送消息?为什么我发的消息没有反应???
(分全给了实在没有分给了)。
//.h  
#define   wm_mythreadmsg   wm_user+100  

static   uint   mfc_mythread(lpvoid   lpparameter);

afx_msg   onmythreadmsg(wparam   wparam,lparam   lparam);


//.cpp
on_message(wm_mythreadmsg,   onmythreadmsg)

void   cacmjkdlg::onbnt_mfc_createthr()  
{
handle   handle;
cwnd   *   pwnd=getdlgitem(idc_edit2);
handle   =   afxbeginthread(mfc_mythread,this);  
sleep(1000);

}

uint   cacmjkdlg::mfc_mythread(lpvoid   lpparameter)
{
    while(1)
    {              
        char   str[256]={0};
        printf( "123456%s ",str);
        cacmjkdlg*   pdlg=(cacmjkdlg*)lpparameter;
        pdlg-> getdlgitem(idc_edit2)-> sendmessage(wm_mythreadmsg,(uint)str,0);  

      }        
      return   0;
}  

cacmjkdlg::onmythreadmsg(wparam   wparam,lparam   lparam)
{
                  afxmessagebox( "收到消息 ");
//char   *p   =   (char*)wparam;  
//printf( "123456789%s ",m_strthread);
//updatedata(false);

}
发表于:2007-07-10 14:28:351楼 得分:0
刚刚开始学习vc,对线程方面的还有很多不懂,请各位大虾多帮忙。
发表于:2007-07-10 17:24:502楼 得分:0
怎么没有人来回答一下???
发表于:2007-07-10 17:57:303楼 得分:50
pdlg-> getdlgitem(idc_edit2)-> sendmessage(wm_mythreadmsg,(uint)str,0);   改为:pdlg-> sendmessage(wm_mythreadmsg,(uint)str,0);
发表于:2007-07-10 18:08:514楼 得分:0
postthreadmessage
发表于:2007-07-10 21:40:585楼 得分:0
要给线程添加消息泵,然后用postthreadmeesage.   要不然你的消息线程也收不到。
发表于:2007-07-11 10:37:206楼 得分:0
线程没有消息环,谁来给你接收和分发消息。要有消息循环
发表于:2007-07-11 14:42:387楼 得分:0
拜托,楼主的消息显然是发给了主ui线程了,楼上几位怎么能说主线程没有消息循环???
从工作线程里面向主线程的窗口发消息是允许的,但最好使用postmessage。但楼主的问题是消息发错窗口了,因为消息映射on_message(wm_mythreadmsg,   onmythreadmsg)是响应pdlg的wm_mythreadmsg消息,而楼主却把消息发给了pdlg-> getdlgitem(idc_edit2)窗口,去掉getdlgitem(idc_edit2)即可。
发表于:2007-07-11 20:35:358楼 得分:10
如johnxt所说,  
pdlg-> getdlgitem(idc_edit2)-> sendmessage(wm_mythreadmsg,(uint)str,0);  
和cacmjkdlg::onmythreadmsg(wparam   wparam,lparam   lparam)
是不匹配的,   建议使用
pdlg-> sendmessage(wm_mythreadmsg,(uint)str,0);  
同时在   pdlg   中重新影射一个   wm_mythreadmsg   的处理函数即可.

如果要使用线程消息,   则要先确定处理该消息的线程,   先找到该线程的   id,   然后调用   postthreadmeesage   函数发送消息,   而在接收消息的线程中也必须要实现消息循环,   由于   postthreadmessage   不是给窗口发送消息,   在接受消息的时候也就不能使用   mfc   中的窗口消息影射,   只能使用   window   api   函数   getmessage   或者   peekmessage   进行接收,   接收消息时窗口句柄必须设置为   null,   否则该消息接受不到,   接收到消息时可根据   msg   结构中的   hwnd   成员为   null的条件进行过滤,   因为线程消息的   hwnd   成员必然为空.
发表于:2007-07-12 09:15:499楼 得分:0
非常谢谢     johnxt()   (   )   信誉:100


快速检索

最新资讯
热门点击