安顺网站开发,做一个展示型网站要多少钱,长春电商网站建设公司电话,如何做高网站的浏览量MFC多线程编程
(2007-11-20 17:56:36) 分类#xff1a; vc 基于MFC的多线程编程 MFC是微软的VC开发集成环境中提供给程序员的基础函数库#xff0c;它用类库的方式将Win32 API进行封装#xff0c;以类的方式提供给开发者。由于其快速、简捷、功能强大等特点深受广大开发者喜…MFC多线程编程
(2007-11-20 17:56:36) 分类 vc 基于MFC的多线程编程 MFC是微软的VC开发集成环境中提供给程序员的基础函数库它用类库的方式将Win32 API进行封装以类的方式提供给开发者。由于其快速、简捷、功能强大等特点深受广大开发者喜爱。因此建议使用MFC类库进行应用程序的开发。 在VC附带的MFC类库中提供了对多线程编程的支持基本原理与基于Win32 API的设计一致但由于MFC对同步对象做了封装因此实现起来更加方便避免了对象句柄管理上的烦琐工作。 在MFC中线程分为两种工作线程和用户接口线程。工作线程与前面所述的线程一致用户接口线程是一种能够接收用户的输入、处理事件和消息的线程。 1. 工作线程 工作线程编程较为简单设计思路与前面所讲的基本一致: 一个基本函数代表了一个线程创建并启动线程后线程进入运行状态; 如果线程用到共享资源则需要进行资源同步处理。这种方式创建线程并启动线程时可调用函数 CWinThread*AfxBeginThread( AFX_THREADPROC pfnThreadProc, LPVOID pParam,int nPriority THREAD_PRIORITY_NORMAL,UINT nStackSize 0,DWORD dwCreateFlags0, LPSECURITY_ATTRIBUTES lpSecurityAttrs NULL);参数pfnThreadProc是线程执行体函数函数原形为: UINT ThreadFunction( LPVOID pParam)。 参数pParam是传递给执行函数的参数 参数nPriority是线程执行权限可选值 THREAD_PRIORITY_NORMAL、THREAD_PRIORITY_LOWEST、THREAD_PRIORITY_HIGHEST、THREAD_PRIORITY_IDLE。 参数dwCreateFlags是线程创建时的标志可取值CREATE_SUSPENDED表示线程创建后处于挂起状态调用ResumeThread函数后线程继续运行或者取值“0”表示线程创建后处于运行状态。 返回值是CWinThread类对象指针它的成员变量m_hThread为线程句柄在Win32 API方式下对线程操作的函数参数都要求提供线程的句柄所以当线程创建后可以使用所有Win32 API函数对pWinThread-m_Thread线程进行相关操作。 注意如果在一个类对象中创建和启动线程时应将线程函数定义成类外的全局函数。 2. 用户接口线程 基于MFC的应用程序有一个应用对象它是CWinApp派生类的对象该对象代表了应用进程的主线程。当线程执行完并退出线程时由于进程中没有其他线程存在进程自动结束。类CinApp从CinThread派生出来CinThread是用户接口线程的基本类。我们在编写用户接口线程时需要从CinThread派生我们自己的线程类ClassWizard可以帮助我们完成这个工作。 先用ClassWizard派生一个新的类设置基类为CwinThread。注意类的DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE宏是必需的因为创建线程时需要动态创建类的对象。根据需要可将初始化和结束代码分别放在类的InitInstance和ExitInstance函数中。如果需要创建窗口则可在InitInstance函数中完成。然后创建线程并启动线程。可以用两种方法来创建用户接口线程MFC提供了两个版本的AfxBeginThread函数其中一个用于创建用户接口线程。第二种方法分为两步进行首先调用线程类的构造函数创建一个线程对象其次调用CWinThread::CreateThread函数来创建该线程。线程建立并启动后在线程函数执行过程中一直有效。如果是线程对象则在对象删除之前先结束线程。CWinThread已经为我们完成了线程结束的工作。 3. 线程同步 前面我们介绍了Win32 API提供的几种有关线程同步的对象在MFC类库中对这几个对象进行了类封装它们有一个共同的基类CSyncObject它们的对应关系为: Semaphore对应CSemaphore、Mutex对应CMutex、Event对应CEvent、CriticalSection对应CCriticalSection。另外MFC对两个等待函数也进行了封装即CSingleLock和CMultiLock。因四个对象用法相似在这里就以CMutex为例进行说明 创建一个CMutex对象: CMutex mutex(FALSE,NULL,NULL); 或CMutex mutex; 当各线程要访问共享资源时使用下面代码 CSingleLock sl(mutex); sl.Lock(); if(sl.IsLocked()) //对共享资源进行操作... sl.Unlock(); 结束语