所有的线程都用一个消息队列吗
答案:2 悬赏:60 手机版
解决时间 2021-03-24 09:32
- 提问者网友:骑士
- 2021-03-23 10:14
所有的线程都用一个消息队列吗
最佳答案
- 五星知识达人网友:街头电车
- 2021-03-23 10:22
这到不是.一个线程是否拥有消息队列要看它是否调用到了ui模块的功能
如果没有的话,就共用主线程消息队列
如果没有的话,就共用主线程消息队列
全部回答
- 1楼网友:封刀令
- 2021-03-23 11:28
消息线程与线程?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();//恢复线程
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯