MFC多线程有两类,工作者线程和用户界面线程
两者主要的区别是工作者线程没有消息循环,用户界面线程有自己的消息队列和消息循环.
工作者线程没有消息机制,通常用来执行后台计算和维护任务,如冗长的计算过程,打印机的后台打印等,要用到6个参数.用户界面线程一般用于处理独立于其他线程执行之外的用户输入,响应用户及系统所产生的事件和消息等,要用到5个参数.
但对于Win32的API编程而言,这两种线程是没有区别的,它们都只需线程的启动地址即可启动线程来执行任务。
两种重载函数原型和参数分别说明如下:
(1) CWinThread* AfxBeginThread(
AFX_THREADPROC pfnThreadProc,
LPVOID pParam,
nPriority=THREAD_PRIORITY_NORMAL,
UINT nStackSize=0,
DWORD dwCreateFlags=0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL);
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)。