MFC星火01_多线程初探

来源:互联网 发布:ubuntu 中文环境 编辑:程序博客网 时间:2024/04/30 04:57

MFC多线程有两类,工作者线程和用户界面线程


两者主要的区别是工作者线程没有消息循环,用户界面线程有自己的消息队列和消息循环.

工作者线程没有消息机制,通常用来执行后台计算和维护任务,如冗长的计算过程,打印机的后台打印等,要用到6个参数.

用户界面线程一般用于处理独立于其他线程执行之外的用户输入,响应用户及系统所产生的事件和消息等,要用到5个参数.


但对于Win32的API编程而言,这两种线程是没有区别的,它们都只需线程的启动地址即可启动线程来执行任务。


 在MFC中,一般用全局函数AfxBeginThread()来创建并初始化一个线程的运行,该函数有两种重载形式,分别用于创建工作者线程和用户界面线程。

两种重载函数原型和参数分别说明如下:


(1) CWinThread* AfxBeginThread(
AFX_THREADPROC pfnThreadProc,
                      LPVOID pParam,
                      nPriority=THREAD_PRIORITY_NORMAL,
                      UINT nStackSize=0,
                      DWORD dwCreateFlags=0,

                     LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL);


PfnThreadProc:指向工作者线程的执行函数的指针,线程函数原型必须声明如下: 
UINT ExecutingFunction(LPVOID pParam);
请注意,ExecutingFunction()应返回一个UINT类型的值,用以指明该函数结束的原因。一般情况下,返回0表明执行成功。
pParam:传递给线程函数的一个32位参数,执行函数将用某种方式解释该值。它可
以是数值,或是指向一个结构的指针,甚至可以被忽略;
nPriority:线程的优先级。如果为0,则线程与其父线程具有相同的优先级;
nStackSize:线程为自己分配堆栈的大小,其单位为字节。如果nStackSize被设为0,
则线程的堆栈被设置成与父线程堆栈相同大小;
dwCreateFlags:如果为0,则线程在创建后立刻开始执行。如果为CREATE_SUSPEND,
则线程在创建后立刻被挂起;
lpSecurityAttrs:线程的安全属性指针,一般为NULL;

注意
pfnThreadProc如果是类的成员函数需要定义为静态成员类型的,然后还需要注意静态成员函数不能直接调非静态成员函数,需要调指针作为中介。


(2) CWinThread* AfxBeginThread(
CRuntimeClass* pThreadClass,
                      int nPriority=THREAD_PRIORITY_NORMAL,
                      UINT nStackSize=0,
                      DWORD dwCreateFlags=0,
                      LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL);
pThreadClass 是指向 CWinThread的一个导出类的运行时类对象的指针,该导出类定义了被创建的用户界面线程的启动、退出等;
其它参数的意义同形式(1)。

原创粉丝点击