求教多线程接收消息队列的问题

 我来答
su...6@sina.com
2016-12-12 · TA获得超过144个赞
知道小有建树答主
回答量:626
采纳率:0%
帮助的人:259万
展开全部
消息线程与线程?Windows编程里并没有这种划分。

线程有两种,分别叫用户界面线程和工作者线程,很多人误以为这两个种类是在线程最初建立时为其赋予的天生的属性,实际上它们的区别不在于建立时,而在于运行时是否创建了消息队列,任何线程在最初建立时是一样的。

无论是系统在启动窗口程序时为其建立一个主线程,还是程序员在主线程运行时调用CreateThread建立一个新线程,内部过程以及为线程建立的内部数据结构是一样的,都是调用Ntdll.dll的RtlUserThreadStart函数并传入线程入口指令地址和一个线程参数(系统启动主线程时传入的线程参数为0)。这时它们都没有自己的线程消息队列,都是工作者线程。但是窗口程序的主线程往往在启动后很快建立一个窗口并循环调用GetMessage抓取消息,而一旦线程调用一个与图形用户界面有关的函数,如GetMessage/PeekMessage检查消息队列或建立一个窗口,系统就会为该线程分配一些与用户界面相关的资源,尤其是分配一个用于管理消息队列的THREADINFO结构,这时线程的消息队列就建立起来,主线程也就转变为用户界面线程。

所以即使MFC程序员是调用AfxBeginThread(ThreadProc,Param)方式建立了一个工作者线程,但是他依然可以在线程函数中通过创建一个窗口或调用GetMessage/PeekMessage函数为线程建立消息队列,使其转变为用户界面线程。

MFC直接建立用户界面线程的方法是:
首先从CWinThread类派生一个新的线程类,就叫它CMultipleThread吧,这个类下需要有窗体成员CMultipleThreadDlg* m_pDlg用于在窗体上显示,要不然怎么叫界面进程呢?还需要重载虚函数virtual int Run(),在Run函数里进行需要的操作。
接着就可以在程序创建该线程
CMultipleThread* pThread = (CMultipleThread*)AfxBeginThread(RUNTIME_CLASS(CMultipleThread),THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED,NULL),
pThread->SetOwner(this)//设置窗口指针
pThread->ResumeThread();//恢复线程
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式