在OnStartthread()函数中添加如下代码:
void CThreadView::OnStartthread()
{
// TODO: Add your mand handler code here
HWND hWnd = GetSafeHwnd();
AfxBeginThread(ThreadProc; hWnd; THREAD_PRIORITY_NORMAL);
}
添加的代码将调用ThreadProc(),这个函数是新添加的线程的控制函
数,所以还需要在程序中添加这个函数。
在ThreadView。cpp中OnStartthread()的上面添加函数ThreadProc
()。
l 注意:
…………………………………………………………Page 641……………………………………………………………
l 这个函数是一个全局函数,而并非是CThreadView类的成员函数,
尽管它在CThreadView类的执行文件中。
在函数ThreadProc()中添加如下代码:
UINT ThreadProc(LPVOID param)
{
::MessageBox((HWND)param; 〃Thread activated。〃; 〃Thread〃; MB_OK);
return 0;
}
这个线程实际上并没有作什么,它仅仅报告它被启动了。
在函数前面的两个冒号表明是在调用全局函数,对于Windows程序员
来说,这通常称为API或SDK调用。
当你运行这个程序后,主窗口出现。选择 “线程”菜单中的 “启动线
程”菜单选项,系统启动一个线程,并且显示一个消息框,如图12。1
所示。
图12。 1 线程启动消息框
第二节 线程间通信
通常,一个次要的线程为主线程执行一定的任务,这也暗示这在主线
程和次要线程之间需要有一个联系的渠道。有几种方法可以完成这些
联系任务:使用全局变量、使用CEven类或者使用消息。本节将介绍
这几种方法。
(1) 使用全局变量通信
假定你需要你的程序能够停止线程。你需要一个告诉线程何时停止的
方法。一种方法是建立一个全局变量,然后让线程监督这个全局变量
是否为标志线程终止的值。为了实现这种方法,按照如下步骤修改前
面创建的Thread程序。
1。 在 “线程”菜单中添加菜单项 “停止线程”,ID为
…………………………………………………………Page 642……………………………………………………………
ID_STOPTHREAD。
2。 为 “停止线程”添加消息处理函数OnStopthread()。
3。 在ThreadView。cpp文件中添加一个全局变量threadController。
添加方法是在ThreadView。cpp的最上面,在endif下面添加下面的语
句:
volatile int threadController;
关键字volatile表示你希望这个变量可以被外面使用它的线程修改。
4。 修改OnStartthread()函数,代码如下所示:
void CThreadView::OnStartthread()
{
// TODO: Add your mand handler code here
threadController = 1;
HWND hWnd = GetSafeHwnd();
AfxBeginThread(ThreadProc; hWnd; THREAD_PRIORITY_NORMAL);
}
现在你可能已经猜到threadController的值决定线程是否继续。
5。 在OnStopthread()函数中添加下列代码:
threadController = 0;
6。 修改ThreadProc()函数的代码,代码如下:
UINT ThreadProc(LPVOID param)
{
::MessageBox((HWND)param; 〃Thread activated。〃; 〃Thread〃; MB_OK);
while (threadController == 1)
{
;
}
…………………………………………………………Page 643……………………………………………………………
::MessageBox((HWND)param; 〃Thread stopped。〃; 〃Thread〃; MB_OK);
return 0;
}
现在线程首先显示一个消息框,告诉用户线程被启动了。然后通过一
个while循环检查全局变量threadController,等待它的值变成0。尽
管这个while循环微不足道,但是你在这里可以加上执行你希望的任
务的代码。
现在编译并运行这个程序,选择 “线程”菜单中的 “启动线程”菜单
项启动一个线程,这是弹出如图12。1所示的对话框。然后选择 “线
程”主菜单中的 “停止菜单”菜单项,这时弹出如图12。2所示的对话
框,告诉用户线程已经终止。
图12。 2 线程关闭消息框
(2) 使用用户自定义消息通信
现在你有了一个简单的用于从主线程中联系附加线程的方法。反过
来,如何从附加线程联系主线程呢?最简单的实现这种联系的方法是
在程序中加入用户定义的Windows消息。
首先,要定义用户消息。这一步很容易,例如:
const WM_USERMSG = WM_USER + 100;
WM_USER变量是由Windows定义的,它是第一个有效的用户消息数。因
为你的程序的其它部分也会使用用户消息,故将新的用户消息
WM_USERMSG设置为WM_USER+100 。
在定义了用户消息之后,你应当在线程中调用::PostMessage()函数
来向主线程发送你所需要的消息。一般按照下面的方式调
用::PostMessage()函数:
::PostMessage((HWND)param; WM_USERMSG; 0; 0);
PostMessage()的四个参数分别是接收消息的窗口的句柄、消息的
ID、消息的WPARAM和LPARAM参数。
…………………………………………………………Page 644……………………………………………………………
将下面的语句加入到ThreadView。h中CThreadView类声明的上面。
const WM_THREADENDED = WM_USER + 100;
仍然是在此头文件中,在消息映射中加入下列语句,注意要加到
AFX_MSG的后面和DECLARE_MESSAGE_MAP的前面。
afx_msg LONG OnThreadended();
然后切回到ThreadView。cpp,在类的消息映射中加入下列语句,位置
在}}AFX_MSG_MAP之后。
ON_MESSAGE(WM_THREADENDED; OnThreadended)
再用下面的语句更改ThreadProc()函数。
UINT ThreadProc(LPVOID param)
{
::MessageBox((HWND)param; 〃Thread activated。〃; 〃Thread〃; MB_OK);
while (threadController == 1)
{
;
}
::PostMessage((HWND)param; WM_THREADENDED; 0; 0);
return 0;
}
在CThreadView中添加下面的成员函数。
LONG CThreadView::OnThreadended(WPARAM wParam; LPARAM lParam)
{
AfxMessageBox(〃Thread ended。〃);
return 0;
}
…………………………………………………………Page 645……………………………………………………………
图12。 3 线程终止对话框
当你重新运行这个程序时,选择 “线程”主菜单中的 “启动线程”菜
单选项,弹出一个消息框告诉你线程已经启动。为了结束这个线程,
选择 “线程”主菜单中的 “停止菜单”菜单选项,这将弹出一个如图
12。3所示的消息框告诉你线程已经停止。
(3) 使用Event对象通信
一个比较复杂的在两个线程间通信的方法是使用Event对象,在MFC下
也就是CEvent类对象。一个Event对象可以有两种状态:通信状态和
非通信状态。线程监视着Event对象的状态,并由此在合适的时间执
行它们的操作。
创建一个CEvent类的对象很简单,如下:
CEvent threadStart;
实际上,CEvent的构造函数形式如下:
CEvent( BOOL bInitiallyOwn = FALSE; BOOL bManualReset = FALSE;
LPC
小说推荐
- C语言游戏编程从入门到精通(PDF格式)
- -Page 1-Page 2-Page 3-Page 4-Page 5-Page 6-Page 7-Page 8-Page 9-Page 10-Page 11-Page 12-Page 13-Page 14
- 其他
- 最新章:第4章
- JMS简明教程(PDF格式)
- -Page 1-JMS1.1规范中文版卫建军2007‐11‐22-Page 2
- 其他
- 最新章:第28章
- SQL语言艺术(PDF格式)
- -Page 1-SQLSSQQLL语言艺术内容介绍本书分为12章,每一章包含许多原则或准则,并通过举例的方式对原则进行解释说明。这些例子大多来自于实际案例,对九种SQL经典查询场景以及其性能影响讨论,非常便于实践,为你数据库应用维护人员阅读。资深 SQL 专家 Stéphane Faroult倾力打
- 其他
- 最新章:第27章
- 软件工程实践者的思想(PDF格式)
- -Page 1-大 道 至 简—软件工程实践者的思想周爱民(Aimingoo 著-Page 2-序2004 年 11 月初爱民(Aimingoo)第一次把他的书稿给我,我翻看了一下,第一反应讲的是感想。这不错,在技
- 其他
- 最新章:第26章
- asp基础实用教程(DOC格式)
- 目 录一、关于ASP二、ASP的新功能三、创建ASP页四、使用脚本语言五、使用变量和常量六、使用集合七、ASP内建对象八、向浏览器发送内容九、包含文件十、访问数据库十一、调试ASP脚本十二、维护ASP应用程序的安全一、关于ASP Active Server Pages(ASP)是服务器端脚本编写环境
- 其他
- 最新章:第17章
- Linux实用培训教程(PDF)
- -Page 1-rrktqt的个人空间 Linux实用培训教程第一部分 作者:红联Linux实用培训教程第一部分-共三部分解的Linux知识,循序渐进的介绍Linux相关知识,从入门到提高,希望对所有学习Linux的朋友都有帮助 红联Linux论坛是致力于Linux技术讨论的站点,目前网站收录的文章
- 其他
- 最新章:第42章
- php程序设计简明教程(DOC格式)
- -Page 1-PHP 程序设计简明教程PHP 讲义 第 1 页 共 90 页-Page 2-目录序 4第一章 PHP 简介 6
- 其他
- 最新章:第31章
- 路由器基本知识及应用实例(DOC格式)
- 第二章 路由器第一节 路由器发展概述自从1984年问世至今,路由器已经走过了近20年的快速技术发展历程。路由器的应用领域不断扩展、从单一的互通网关逐渐扩展到覆盖广域网、城域网乃至用户接入的各个领域。近年来,路由器早已逐渐脱离单纯用于企业网出口和互联的概念,开始成为运营网络和各种专用业务网络的核心设备
- 其他
- 最新章:第48章
- Java编程思想第4版[中文版](PDF格式)
- -Page 1-Page 2《Thinking In Java》中文版作者:Bruce Eckel主页:http/BruceEckel.编译:Trans Bot主页:http/memberease~transbot致谢-献给那些直到现在仍在孜孜不倦创造下一代计算机语言的人们!指导您利用万维网的语言进
- 其他
- 最新章:第295章