用户消息在线程中如何使用? 我想写一个Worker Thread,在该线程完成一功能时需要通知指定窗口,让窗口完成后续工作,我想通过Worker Thread投寄一条用户消息到指定窗口,触发窗口处理程序。 请问如何定义、使用该用户自定义的用户消息来完成我所想的功能。 不胜感激 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 ::PostMessage(...)只要你的线程传递参数有了原来窗口的东西就行了调用DWORD dwThreadID;m_hCommThread = CreateThread( NULL, 0, ThreadProc, this, 0, &dwThreadID );//注意this传回DWORD CComm::ThreadProc( LPVOID lpParam ){ CComm *pThis = ( CComm * )lpParam; DWORD dwEvents, dwBytesRead; while( pThis->m_bCommOpen ) { if( WaitCommEvent( pThis->m_hComm, &dwEvents, NULL ) ) { if( dwEvents == EV_RXCHAR ) { dwBytesRead = pThis->ReadCommBlock( pThis->m_byteBuffer, 1024 ); if(dwBytesRead) { ResetEvent( pThis->m_hEvBufferEmpty ); ::PostMessage( pThis->m_MainWindow, UM_DATAARRIVAL, 0, dwBytesRead ); WaitForSingleObject( pThis->m_hEvBufferEmpty, INFINITE ); } } } else { if( GetLastError() != 995 ) pThis->ShowError(); //AfxMessageBox( "后台线程错误, [GetLastError() != 995]", MB_OK, MB_ICONSTOP ); return 0; } } return 1;} 改正一下::PostMessage( pThis->m_hWnd, UM_DATAARRIVAL, 0, dwBytesRead ); 在一个都能到达的头文件里写1.#define WM_MY_MSG (WM_USER + 0x100) //这里这个值自己定了2.然后再窗口类里添件函数LRESULT MyMsgProc(WPARAM,LPARAM);3.然后再窗口的映射里(BEGIN_MESSAGE_MAP后面,END_MESSAGE_MAP前面 )加上一行ON_MESSAGE(WM_MY_MSG,MyMsgProc)4.加上MyMsgProc的代码在窗口类CPP里加上LRESULT MyWnd::MyMsgProc(WPARAM w,LPARAM l){//do somethingreturn NULL;}5.然后在线程相应地方加上::PostMessage(hWnd,WM_MY_MSG,NULL,NULL);//其中hWnd是要传递信息的窗口句并,想办法传进线程久可以了 大概如下:假设你的窗口类名为CHandWnd;你在你的窗口类中定义一个用户消息,假设为#define WORKER_FINISHED (WM_USER + 0x01)然后,在你的窗口类定义中加入如下的函数定义protected:void OnWorkerFinished(WPARAM wParam,LPARAM lParam);同时,在你的窗口类实现的.cpp文件中加入void CHandWnd::OnWorkerFinished(WPARAM wParam,LPARAM lParam){ // 此处添加你自己的窗口处理程序 return;}同时,在.cpp文件的BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之间加入如下语句:ON_MESSAGE(WORKER_FINISHED,OnWorkerFinished).ok,当你的线程工作完后,通过sendmessage向你的窗口发送消息:消息号就是上面定义的WORKER_FINISHED,如果没有要传递的参数,随便在发送时填写一个值就可以了,一般建议填写0.祝你好运!^_^ http://www.codeproject.com/threads/usingworkerthreads.asp http://www.codeproject.com/useritems/workerthread.asphttp://www.codeproject.com/threads/sync.asphttp://www.codeproject.com/threads/cthread.asp jennyvenus(JennyVenus)说得对,我也是这样干的,不过要记住,千万不要将对话框给提前干掉了 http://www.csdn.net/expert/topic/543/543238.xml?temp=.8249933 在我举的例子中,头文件要添上 afx_msg LRESULT OnDataArrival( WPARAM wparam, LPARAM lparam );.cpp的消息映射中要添上 ON_MESSAGE( UM_DATAARRIVAL, OnDataArrival )最后要实现类似于我的 OnDataArrival函数 gateh(幻影) 的隐射函数类型错了 为啥我接收到的文件要比发送的大? 请教如何从文件中读取4个字节的数据显示出来 非模式对话框中的图片更换 欢迎加入技术系列群2307382,我们的家!!! 高分求救,C#程序如何屏蔽alt+f4,高手帮忙! 我想实现实时数据监测,请高手过来看一下应该怎么弄? 为什么同样的代码在2000 下运行良好,但在xp下却会崩掉???!!! #ifdef 是什么意思 一个很简单有关于树形结构的问题 非常着急的求助 怎么样实现目录之间的拷贝!??? 请问一个有关VIEW和DOC的问题
调用
DWORD dwThreadID;
m_hCommThread = CreateThread( NULL, 0, ThreadProc, this, 0, &dwThreadID );//注意this
传回
DWORD CComm::ThreadProc( LPVOID lpParam )
{
CComm *pThis = ( CComm * )lpParam; DWORD dwEvents, dwBytesRead; while( pThis->m_bCommOpen )
{
if( WaitCommEvent( pThis->m_hComm, &dwEvents, NULL ) )
{
if( dwEvents == EV_RXCHAR )
{
dwBytesRead = pThis->ReadCommBlock( pThis->m_byteBuffer, 1024 );
if(dwBytesRead)
{
ResetEvent( pThis->m_hEvBufferEmpty );
::PostMessage( pThis->m_MainWindow, UM_DATAARRIVAL, 0, dwBytesRead );
WaitForSingleObject( pThis->m_hEvBufferEmpty, INFINITE );
}
}
}
else
{
if( GetLastError() != 995 )
pThis->ShowError();
//AfxMessageBox( "后台线程错误, [GetLastError() != 995]", MB_OK, MB_ICONSTOP );
return 0;
}
}
return 1;
}
::PostMessage( pThis->m_hWnd, UM_DATAARRIVAL, 0, dwBytesRead );
1.#define WM_MY_MSG (WM_USER + 0x100) //这里这个值自己定了
2.然后再窗口类里添件函数LRESULT MyMsgProc(WPARAM,LPARAM);
3.然后再窗口的映射里(BEGIN_MESSAGE_MAP后面,END_MESSAGE_MAP前面 )
加上一行ON_MESSAGE(WM_MY_MSG,MyMsgProc)
4.加上MyMsgProc的代码
在窗口类CPP里加上
LRESULT MyWnd::MyMsgProc(WPARAM w,LPARAM l)
{
//do something
return NULL;
}
5.然后在线程相应地方加上
::PostMessage(hWnd,WM_MY_MSG,NULL,NULL);
//其中hWnd是要传递信息的窗口句并,想办法传进线程久可以了
假设你的窗口类名为CHandWnd;
你在你的窗口类中定义一个用户消息,假设为
#define WORKER_FINISHED (WM_USER + 0x01)然后,在你的窗口类定义中加入如下的函数定义
protected:
void OnWorkerFinished(WPARAM wParam,LPARAM lParam);
同时,在你的窗口类实现的.cpp文件中加入
void CHandWnd::OnWorkerFinished(WPARAM wParam,LPARAM lParam)
{
// 此处添加你自己的窗口处理程序
return;
}
同时,在.cpp文件的
BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之间加入如下语句:
ON_MESSAGE(WORKER_FINISHED,OnWorkerFinished)
.
ok,当你的线程工作完后,通过sendmessage向你的窗口发送消息:消息号就是上面定义的WORKER_FINISHED,如果没有要传递的参数,随便在发送时填写一个值就可以了,一般建议填写0.
祝你好运!^_^
http://www.codeproject.com/threads/sync.asp
http://www.codeproject.com/threads/cthread.asp
afx_msg LRESULT OnDataArrival( WPARAM wparam, LPARAM lparam );
.cpp的消息映射中要添上
ON_MESSAGE( UM_DATAARRIVAL, OnDataArrival )
最后要实现类似于我的
OnDataArrival函数
的隐射函数类型错了