预览加载中,请您耐心等待几秒...
1/7
2/7
3/7
4/7
5/7
6/7
7/7

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

MFC线程简述: MFC中存在三种线程: Ui线程:通过创建窗口得到,具备标准窗口的功能。 工作者线程:通过CreateThread函数直接创建,不具备消息队列。 带消息队列的工作者线程:通过继承CWinThread得到,具备消息队列。 A种和C种线程使用消息队列,对于使用者来说,这两种线程需要自己本身或其他线程向其发送消息,才进行相应工作,否则保持静默状态,该两种线程擅长实时处理外部信号。 B种线程不使用消息队列,可以用单个函数作为其线程的本体,适合处理步骤相对固定的算法。 线程间通信的方式: 方式一:全局变量,各线程通过修改全局变量传递信息,通过循环检测查看信息。 方式二:消息传递,通过windows消息机制传递。 方式一问题主要有两个:第一是全局变量过多,不便于管理;第二个是循环检测过于缓慢,并且较不灵活,不能够迅速响应变化。 因此,只有B类型,工作者线程适合使用方式一,其实现也相对简单,下面给出例子: MyThread。h classMyThread { public: ﻩMyThread(); ~MyThread(); ﻩvoidstart();//启动线程 voidsetThreadNumber(int);ﻩ//设置线程标识号 protected: staticDWORDWINAPIrun(LPVOIDlpPram);//线程本体 private: structData ﻩ{ ﻩintthreadNum; ﻩ}data;ﻩ//线程私有变量,每个线程都有独立的data LPVOIDlpData;//线程私有变量的指针 staticintcnt;ﻩ//该类型线程的一个静态(类似全局)变量,该类产生的线程共用 staticHANDLEhMutexCnt;//静态变量cnt关联的互斥对象,用于协调各线程对cnt的访问。 }; MyThread.cpp //注意静态变量需作为全局变量声明,如下 intMyThread::cnt=100; HANDLEMyThread::hMutexCnt=CreateMutex(NULL,FALSE,NULL); //—---—-—-—---—---public--————---——————-—— MyThread::MyThread() { ﻩthis->lpData=(LPVOID)&this-〉data;//初始化私有变量的指针 } MyThread::~MyThread() { } voidMyThread::start() { ﻩHANDLEhThread=CreateThread(NULL,0,MyThread::run,this—〉lpData,0,NULL); CloseHandle(hThread);ﻩ//注意此处并不是杀死线程,而是关闭其句柄(因为现在暂不需要),当线程自行结束后系统会释放句柄。 } voidMyThread::setThreadNumber(intthreadNum) { ﻩthis—〉data.threadNum=threadNum; } //---———-——-—-—--protected-—----—---—--——-- DWORDWINAPIMyThread::run(LPVOIDlpPram) { ﻩMyThread::Data*tpData=(MyThread::Data*)lpPram; //注意与CreateThread处比较,lpPram其实就是this->lpData,之所以要传递指针是因为静态函数是该类所有对象的公有成员,不能通过this来指定成员变量。 cout〈〈”Thread"<〈tpData—>threadNum<〈"isrunning\n”<〈endl; while(true)//循环 ﻩ{ ﻩif(MyThread::cnt>0) { WaitForSingleObject(MyThread::hMutexCnt,INFINITE);//检查是否有其他的线程在使用cnt,如有,等待,无,则抢占cnt的使用权. ﻩcout〈<"Thread”<<tpData-〉threadNum<<":"〈〈MyThread::cnt——〈<endl; ReleaseMutex(MyThread::hMutexCnt);//释放cnt的使用权. ﻩ} else ﻩ{ WaitForSingleObject(MyThread::hMutexCnt,INFINITE); cout<〈"None.\n"〈<endl; ﻩReleaseMutex(MyThread::hMutexCnt); break;//当cnt减到为0的时候,退出循环。 } } return0; //函数