设为首页 加入收藏

TOP

9.2.3 工作线程实现的技巧
2013-10-07 00:14:05 来源: 作者: 【 】 浏览:54
Tags:9.2.3 工作 线程 实现 技巧

9.2.3  工作线程实现的技巧

1.问题阐述

工作线程是用于处理后台工作的,我们平常接触到的后台打印就是一个工作线程的例子。下面我们看看如何创建一个工作线程。


创建一个工作线程十分简单,只需要两步:实现线程函数和开始线程。不需要由CWinThread派生类,你可以不加修改地使用CWinThread。


AfxBeginThread有两种形式,一种是用来创建用户界面线程的,另一种就是用来创建工作线程的。为了开始执行线程,只需要向AfxBeginThread提供下面的参数就可以了。
 
线程函数的地址。
 
传送到线程函数的参数。
 
(可选的)线程的优先级,默认的是平常的优先级,如果希望使用其他优先级请参阅::SetThreadPriority。
 
(可选的)线程的堆栈大小,默认的大小是和创建线程的堆栈一样大。
 
(可选的)如果用户创建的线程在开始的时候处于挂起态,而不在运行态,可以设置为CREATE_SUSPENDED。
 
(可选的)线程的安全属性,默认的是和父线程的访问权限一样,有关安全信息的格式,请参阅SECURITY_ATTRIBUTES。

2.实现技巧

AfxBeginThread为用户创建并初始化一个CWinThread对象,运行这个对象,并返回它的地址,这样通过这个地址用户就可以找到它了。在这一过程中还要进行许多检查,这一切都不用你操心。AfxBeginThread函数的声明如下:

 CWinThread* AfxBeginThread(
AFX_THREADPROC pfnThreadProc,
LPVOID pParam,
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
);
那么下面我们来看看线程函数怎么写。线程函数定义了线程要做什么,在进入这个函数的时候线程开始,退出的时候线程结束。这个函数必须是下面的形式:
UINT ControllingFunction( LPVOID pParam );

参数是一个32位数,这个参数是在线程对象创建时传送给对象的构造函数。至于线程函数要怎么处理这个数,那就随便了,它可能是一个人的年纪,可能是一个文件的地址,可能是一个窗口句柄,反正你想它是什么就是什么,主动权在你手里。如果参数指的是一个结构,可以用来向线程传送参数,也可以让线程把结果传回主程序,线程需要通知主程序,什么时候来取结果。
在线程函数结束时,应该返回一个UINT类型的值,说明返回原因,也就是返回代码。通常这个数为0,表示正常返回,当然你也可以定义一个错误编码指示错误了。

3.实例代码

下面是一个线程函数的例子,这个例子解释如何定义线程函数,也介绍了如何从程序的其他地方控制线程:

UINT ThreadProc( LPVOID pParam )
{
return 0;         // 线程成功完成
}
CWinThread* AfxBeginThread(
AFX_THREADPROC pfnThreadProc,    // 线程函数地址
LPVOID pParam,       // 线程参数
int nPriority = THREAD_PRIORITY_NORMAL, // 线程优先级
UINT nStackSize = 0,      // 线程堆栈大小,默认为1M
DWORD dwCreateFlags = 0,     
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
);

4.小结

工作线程通常用于程序的计算、调度等后台任务。工作线程和用户界面线程不同,它不从CWinThread类派生创建,最重要的是实现完成工作线程任务的运行控制函数,即工作线程常表现为函数,这个函数完成线程并行的任务,由其他语句调用工作线程函数将线程启动。

【责任编辑:夏书 TEL:(010)68476606】

回书目   上一节   下一节

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇9.1.6 使用消息实现进程间通信 下一篇9.2.2 创建/终止线程的技巧

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: