Windows平台下的多线程编程(4)
2. 用户接口线程
基于MFC的应用程序有一个应用对象,它是CWinApp派生类的对象,该对象代表了应用进程的主线程。当线程执行完并退出线程时,由于进程中没有其他线程存在,进程自动结束。类CWinApp从CWinThread派生出来,CWinThread是用户接口线程的基本类。我们在编写用户接口线程时,需要从CWinThread派生我们自己的线程类,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();
结束语
如果用户的应用程序需要多个任务同时进行相应的处理,则使用多线程是较理想的选择。这里,提醒大家注意的是在多线程编程时要特别小心处理资源共享问题以及多线程调试问题。笔者准备了几个实例,如大家需要的话,可以和笔者联系。
- 上一篇:用Visual C++实现远程线程嵌入技术
- 下一篇:例程分析多线程编程[图]