消息线程的消息队列与线程的消息队列是一回事吗?
2个回答
展开全部
消息线程与线程?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();//恢复线程
线程有两种,分别叫用户界面线程和工作者线程,很多人误以为这两个种类是在线程最初建立时为其赋予的天生的属性,实际上它们的区别不在于建立时,而在于运行时是否创建了消息队列,任何线程在最初建立时是一样的。
无论是系统在启动窗口程序时为其建立一个主线程,还是程序员在主线程运行时调用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();//恢复线程
更多追问追答
追问
RtlUserThreadStart函数并传入线程入口指令地址和一个线程参数//入口指令地址啥意思?
pThread->SetOwner(this)//设置窗口指针是啥意思?
追答
比如main函数是程序主线程的入口函数,而它第一条指令的地址就是主线程的入口指令地址,线程从这条指令开始执行。
pThread->SetOwner(this) 这个记不太清了,不好意思。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询