- 浏览: 10470 次
最新评论
使用 C++ 和 MFC 进行多线程编程
2010年11月01日
Microsoft 基础类 (MFC) 库提供多线程应用程序支持。本主题描述进程、线程和 MFC 多线程编程方法。 进程是应用程序的执行实例。例如,双击"记事本"图标时,将启动运行"记事本"的进程。
线程是进程内的执行路径。启动"记事本"时,操作系统创建进程并开始执行该进程的主线程。此线程终止时,进程也终止。启动代码以函数地址的形式将此主线程提供给操作系统。通常是所提供的 main 函数或 WinMain 函数的地址。
如果愿意,可以在应用程序中创建其他线程。如果在处理后台任务或维护任务时不希望用户等待这些任务完成,则可能需要创建其他线程。MFC 应用程序中的所有线程都由 CWinThread 对象表示。大多数情况下,甚至不必显式创建这些对象,而只需调用框架 Helper 函数 AfxBeginThread,该函数将为您创建 CWinThread 对象。
MFC 区分两种类型的线程:用户界面线程和辅助线程。用户界面线程通常用于处理用户输入及响应用户生成的事件和消息。辅助线程通常用于完成不需要用户输入的任务(如重新计算)。Win32 API 不区分线程类型;它只需要了解线程的起始地址以开始执行线程。MFC 为用户界面中的事件提供消息泵,从而对用户界面线程进行专门处理。CWinApp 是用户界面线程对象的一个示例,因为它从 CWinThread 派生并对用户生成的事件和消息进行处理。 应特别注意以下情况:可能有不止一个线程需要访问同一对象。多线程编程:编程提示 介绍了一些可以避免在这些情况下可能发生的问题的技术。多线程编程:如何使用同步类说明如何使用可用的类从多个线程同步访问一个对象。 编写和调试多线程编程本身是一项复杂棘手的任务,因为您必须确保一次只能有一个线程访问对象。多线程编程主题没有讲述多线程编程的基础知识,而只是说明了如何在多线程程序中使用 MFC。Visual C++ 中包含的多线程 MFC 示例阐释了几种多线程"添加功能"和 MFC 中未包含的 Win32 API,但只是一些入门知识。
有关操作系统如何处理进程和线程的更多信息,请参见 Platform SDK 中的进程和线程。
用户界面线程通常用于处理用户输入和响应用户事件,这些行为独立于执行该应用程序其他部分的线程。已经创建并启动主应用程序线程(在 CWinApp 导出的类中提供)。本文描述创建其他用户界面线程所需的步骤。
创建用户界面线程时,必须首先从 CWinThread 派生类。必须使用 DECLARE_DYNCREATE 和 IMPLEMENT_DYNCREATE 宏声明并实现此类。此类必须重写某些函数,也可以重写其他函数。下表列出了这些函数及其用途。 函数 用途
ExitInstance 线程终止时执行清除。通常重写。 InitInstance 执行线程实例初始化。必须重写。 OnIdle 执行线程特定的闲置时间处理。通常不重写。 PreTranslateMessage 将消息调度到 TranslateMessage 和 DispatchMessage 之前对其进行筛选。通常不重写。 ProcessWndProcException 截获由线程的消息和命令处理程序引发的未处理异常。通常不重写。 Run 控制线程的函数。包含消息泵。一般不重写。 MFC 通过参数重载提供两个版本的 AfxBeginThread:一个用于用户界面线程,另一个用于辅助线程。若要启动用户界面线程,请调用 AfxBeginThread,提供下列信息: 从 CWinThread 派生的类的 RUNTIME_CLASS。 (可选)所需的优先级级别。默认值为正常优先级。有关可用的优先级级别的更多信息,请参见 Platform SDK 中的 SetThreadPriority。 (可选)所需的线程堆栈大小。默认值与创建线程的堆栈大小相同。 (可选)CREATE_SUSPENDED,如果希望在挂起状态中创建线程。默认值为 0,即正常启动线程。 (可选)所需的安全属性。默认值与父线程具有相同的访问权。有关此安全信息格式的更多信息,请参见 Platform SDK 中的 SECURITY_ATTRIBUTES。 AfxBeginThread 为您完成大部分工作。它创建类的新对象、使用您提供的信息初始化该对象并调用 CWinThread::CreateThread 开始执行线程。在整个过程中进行检查,确保假如创建过程的任何部分出现故障,所有对象都能被正确地解除分配。
MFC 提供的多线程类分为两类:同步对象(CSyncObject、CSemaphore、CMutex、CCriticalSection 和 CEvent)和同步访问对象(CMultiLock 和 CSingleLock)。
当必须控制对资源的访问以确保资源的完整性时,使用同步类。同步访问类用于获取对这些资源的访问权。本主题介绍各个类的适用情况。
若要确定应使用的同步类,请询问以下一系列问题: 应用程序必须等到发生某事才能访问资源(例如,在将数据写入文件之前,必须先从通信端口接收它)吗?
如果是,请使用 CEvent。 同一应用程序内一个以上的线程可以同时访问此资源(例如,应用程序允许在同一文档上最多同时打开五个带有视图的窗口)吗?
如果是,请使用 CSemaphore。 可以有一个以上的应用程序使用此资源(例如,资源在 DLL 中)吗?
如果是,请使用 CMutex。
如果不是,请使用 CCriticalSection。 从不直接使用 CSyncObject。它是其他四个同步类的基类。 以维护链接的帐户列表的应用程序为例。此应用程序允许在独立的窗口中最多检查三个帐户,但是在任何特定的时间,只能更新一个帐户。更新帐户后,通过网络将更新的数据发送到数据存档。
此示例应用程序使用所有这三种类型的同步类。因为它一次最多允许检查三个帐户,因此使用 CSemaphore 限制对三个视图对象的访问。当试图查看第四个帐户时,应用程序或者等到前三个窗口中有一个关闭,或者该尝试失败。更新帐户时,应用程序使用 CCriticalSection 确保一次只更新一个帐户。更新成功后,发出信号 CEvent 以释放等待该事件信号发送的线程。此线程将新数据发送到数据存档。 选择要使用的同步访问类更为简单。如果应用程序只与访问单个受控资源有关,请使用 CSingleLock。如果需要访问多个受控资源中的任何一个,则使用 CMultiLock。在示例 1 中,应使用 CSingleLock,因为在每种情况下,任何特定时间都只需要一个资源。 有关如何使用同步类的信息,请参见多线程处理:如何使用同步类。有关同步的信息,请参见 Platform SDK 中的同步。有关 MFC 中多线程处理支持的信息,请参见使用 C++ 和 MFC 进行多线程处理。 转自:http://hi.baidu.com/crearmore/blog/item/ae9a158207 29a5a50df4d230.html
发表评论
-
多线程加速图像模板匹配
2012-01-20 10:13 677多线程加速图像模板匹 ... -
VC 打开外部文件
2012-01-20 10:13 633VC 打开外部文件 2010年0 ... -
Windows消息机制VC
2012-01-20 10:13 597Windows消息机制VC 2011年0 ... -
windows程序设计相关思想
2012-01-20 10:13 509windows程序设计相关思想 ... -
WinCE驱动开发问题精华集锦
2012-01-19 15:14 464WinCE驱动开发问题精华 ... -
android 各系统区别(android 1.5- android 3.0)
2012-01-19 15:14 351android 各系统区别(android ... -
WinCE驱动开发问题精华集锦(一)
2012-01-19 15:14 288WinCE驱动开发问题精华 ... -
《电脑十万个为什么》 第四卷 第一章
2012-01-19 15:14 668《电脑十万个为什么》 第四卷 第一章 2010年06月07日 ... -
C#面试题集锦(你值得拥有!)
2012-01-17 05:01 557C#面试题集锦(你值得拥有!) 2011年04月22日 ... -
windows编程---在窗口上建立控件
2012-01-17 05:01 582windows编程---在窗口上建立控件 2011年05月3 ... -
C#下MDI形式的图片查看器
2012-01-17 05:01 809C#下MDI形式的图片查看 ... -
Flex开源项目网址列表
2012-01-16 03:52 598Flex开源项目网址列表 2011年06月19日 1. ... -
使用ArcGIS API for Flex开发的地图应用网站
2012-01-16 03:52 705使用ArcGIS API for Flex开发的地图应用网站 ... -
flex类网站收集
2012-01-16 03:52 592flex类网站收集 2010年10月22日 1. Fle ... -
用flex开发 google map应用程式
2012-01-16 03:51 443用flex开发 google map应用程式 2009年09 ... -
N多的好资源链接
2012-01-16 03:51 910N多的好资源链接 2009年07月22日 http:// ...
相关推荐
使用 C++ 和 MFC 进行多线程编程
MFC的多线程 1、创建和终止线程 在MFC程序中创建一个线程,宜调用AfxBeginThread函数。该函数因参数不同而具有两种重载版本,分别对应工作者线程和用户接口(UI)线程。 工作者线程 CWinThread *...
Visual C++高级编程技术——MFC与多线程篇
该例子讲解了在MFC下,如何在多线程方式下利用CSOCKET进行WINDOWSOCKET编程。
1.基于MFC通过多线程实现多个客户端同时连接服务器。 2.服务端通过维护一张转发表来实现对客户端信息的转发,比如客户端A向客户端B发送消息,服务器接收到客户端A发过来消息内容和客户端B信息之后,通过转发表查找到...
多线程,线程同步,线程间通讯详细介绍。多线程是为了使得多个线程并行的工作以完成多项任务,以提高系统的效率。线程是在同一时间需要完成多项任务的时候被实现的。
Win32 SDK函数支持进行多线程的程序设计,并提供了操作系统原理...Visual C++ 6.0中,使用MFC类库也实现了多线程的程序设计,使得多线程编程更加方便。 该教程提供了由浅入深的讲解及Demo,对初学多线程编程很有帮助。
本书主要讲的是多线程编程,还有线程之间的通讯问题,对大家很有帮助,值得下载。
Visual C++ 5.0中多线程 基于MFC的多线程编程
c++多线程编程之二 MFC中的多线程开发 后面还有三和四
使用C++编写的基于MFC和UDP通信协议的多线程程序,接收信息的功能单独在一个线程里,避免主界面卡顿,可以在循环接收信息,将信息显示在文本框并写入txt的同时,点击按钮发送输入另一个文本框的信息
主要介绍了C++ 关于MFC多线程编程的注意事项的相关资料,需要的朋友可以参考下
本书通过众多实例介绍了如何实现Windows下的多线程编程,既重点介绍了Win32API下的多线程编程和MFC下的多线程编程,又介绍了多线程机制在网络编程、图形编程和数据库中的应用。本书每一章都从简单的多线程实例出发...
Visual Stdio中MFC基于对话框编程,使用多线程编程的方法实现在Picture Control中画随机曲线,在线程函数中使用控件变量和主线程成员函数的方法,I/O二进制文件的写入。
多线程编程之二——MFC中的多线开
本论文以陕西省自然科学基金项目(2001年度)—软件逆向工程技术研究为背景,提出了一种软件再设计(redesign)方法,它以面向对象的分析和设计为指导,详述了Windows编程的一个应用领域:多线程通信技术。基于微软基础...
MFC_多线程技术在串口通信中的应用
MFC多线程编程之三——线程间通讯 http://blog.csdn.net/arcsinsin/article/details/16832383 这篇文章的源码实例
1.在MFC框架中通过多线程来实现多个客户端同时与服务器建立Socket连接。 2.通过在服务器端维护一张转发表来实现各个客户端之间的通信,比如客户端A要给客户端B发送消息,首先客户端A把消息内容和客户端B的信息发给...