当前位置:C++技术网 > 资讯 > UI线程深入探索

UI线程深入探索

更新时间:2015-10-14 18:17:37浏览次数:1+次

半夜修软件的水印代码,真无语啊。我硬是改透了代码,查遍了百度,就是没辙。突然,我想到了用UI线程来启动水印代码,就朝那方面着手。但发现自己对那方面的理解还是有点模糊,就深造了下去。突然有点理解了UI线程的工作机制。我们看UI线程的调用函数:


CWinThread* AfxBeginThread(
CRuntimeClass* pThreadClass,
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
);
第一个参数是啥?就是线程类-也就是我们基于CWinThread类创建的线程类来启动UI线程,请看《worker线程与UI线程的学习》里面有UI线程与worker线程的介绍。具体的事例程序请看《实现界面画面启动程序》我们的新建的线程类是基于线程类,而我们又必须有窗口来维护我们的启动界面,因此我们必需一个窗口类来支持。我们创建了一个窗口类,作为系统启动界面。这就是worker线程与UI线程最大的区别,UI线程需要窗口。Win32 说明文件一再强调线程分为 GUI 线程和 worker 线程两种。GUI 线程负责建造窗口以及处理主消息循环。 worker 负责执行纯粹运算工作,如重新计算或重新编页等等,它们会导致主线程的消息队列失去反应。一般而言, GUI线程绝不会去做那些不能够马上完成的工作。GUI 线程的定义是:拥有消息队列的线程。任何一个特定窗口的消息总是被产生这一窗口的线程抓到并处理。所有对此窗口的改变也都应该由该线程完成。
如果 worker 线程也产生了一个窗口,那么就会有一个消息队列随之被产生出来并且附着到此线程身上,于是 worker 线程摇身一变成了 GUI 线程。这里的意思是, worker 线程不能够产生窗口、对话框、消息框,或任何其他与UI 有关的东西。在UI线程相关类中页就是我们的线程类,只有初始化函数中有两句代码。一个是create函数,一个是showsplaswindow函数,可是你会发现,这两句代码的调用是由窗口类的变量m_mysplash决定的。而我们的create函数的具体实现代码也在窗口类中。我们现在来理清下我们程序的运行路径。首先是进入我们APP类的InitInstance虚函数,我们在那里已经写上了AfxBeginThread函数启动线程,接着来到第一个参数也就是我们的线程类,到了这里,就来我们的类的调用了,也就是我们的CSplashThread类,遇到InitInistance函数,进去后就是我们的create等函数了,然后返回这个函数实现的地方也就是我们的窗口类了,在这里才有我们create函数的具体实现代码。UI线程就是一个主管一样,只要分配任务,而做任务的事情就留给程序员(就是窗口来做),而worker线程就是亲力亲为。