多线程与消息机制 基于单文档的MFC程序中,主视图类中启动一个子线程。其中一对话框类向主视图类发送自定义消息,再由主视图类转发消息给子线程。想请教:为什么主视图类转发的自定义消息在子线程中接收不到? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 对线程发消息用PostThreadMessage 是用PostThreadMessage给线程发消息的,可不知道为什么收到,不知道与窗口拆分有没有关系,因为题目中的对话框类不是由主视图类产生的,而是拆分窗口产生的。 知道线程的id,就可以向线程发线程消息线程得有GetMessage循环 线程是主视图的一个成员函数,在主视图中转发由对话框类发过来的消息。 this->m_pGpsThread->PostThreadMessage(WM_FEATURE,NULL,NULL); 如果没有GetMessage循环就只能接收一次或者一类自定义消息? 线程可以多次接收到消息和自定义消息。MSG msg={0};while(GetMessage(&msg,NULL,0,0)){ TranslateMessage(&msg); DispatchMessage(&msg);}和一般窗口消息一样。 首先你必须让自己的线程变成UI线程,这个线程才会有消息队列 只要调用了CreateWIndow 或者GetMessage系统就会分配消息队列给该线程,消息队列都没有怎么接受消息 是将该消息处理的语句放在线程中的run函数是吗?小妹初学者,还望多指教. 有2种方法,一种从CWinThread派生一个类,比如CMyThread,然后CWinThread* AfxBeginThread( CRuntimeClass* pThreadClass, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL );创建线程,CMyThread *pThread = (CMyThread*)::AfxBeginThread(RUNTIME_CLASS(CMyThread),0);-------------------------另一种方法就是GetMessageUINT __cdecl ThreadProc(LPVOID lParam){ MSG msg; while( GetMessage(&msg, NULL, 0, 0)) { switch(msg.message) { case WM_SENDFILEDATA: Sleep(1); break; case WM_RECVFILEDATA: Sleep(1); break; } TranslateMessage(&msg); DispatchMessage(&msg); } return 0;} MFC VLC 播放器 打开rtsp串流 服务器用MFC编的程序,没有人动他,自己会自动关闭 有语句return #msgname;,其中msgname是一个标量 请问#代表什么意思呢? import一个dll的作用是什么? 一个奇怪的问题 已知用 LockWorkStation()可以锁定工作站,但我的程序要怎么才知道当前工作站是否被锁定? 在线急问! VisualStudio(嗷) 进来领分 问:如何使对话框右上角的小叉叉变灰? 求教一个关于recv函数的问题 mfc把剪贴板中的图形显示在对话框的图片控件 第一个MFC的错误
线程得有GetMessage循环
this->m_pGpsThread->PostThreadMessage(WM_FEATURE,NULL,NULL);
MSG msg={0};
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
和一般窗口消息一样。
首先你必须让自己的线程变成UI线程,这个线程才会有消息队列 只要调用了CreateWIndow 或者GetMessage系统就会分配消息队列给该线程,消息队列都没有怎么接受消息
CWinThread* AfxBeginThread(
CRuntimeClass* pThreadClass,
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
);
创建线程,CMyThread *pThread = (CMyThread*)::AfxBeginThread(RUNTIME_CLASS(CMyThread),0);
-------------------------
另一种方法就是GetMessage
UINT __cdecl ThreadProc(LPVOID lParam)
{
MSG msg;
while( GetMessage(&msg, NULL, 0, 0))
{
switch(msg.message)
{
case WM_SENDFILEDATA:
Sleep(1);
break; case WM_RECVFILEDATA:
Sleep(1);
break;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}