VC中多线程操作.doc

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
VC中多线程操作.doc

在线程之间传送信号可以使用事件对象,用MFC的CEvent来表示。一个事件对象有两种状态:信号态与非信号态。线程能监视于信号态的事件,以便在适当的时间完成对事件的操作。 创建事件的语句如下: CEvent ThreadBegin; 事件被创建后就自动处于非信号态,要使用它处于信息态,必须使用对件对象的成员函数SetEvent(),即: ThreadBegin.SetEvent(); 线程监视这个信号来知道事件已准备就绪,从而可以进行其它的操作。而线程通过调用API函数WaitForSingleObject()来监视这个信号。 ::WaitForSingleObject(ThreadBegin.m_hObject,INFINITE); 该函数的两个参数分别表示要检查的事件句柄与函数等待事件时间。 INFINITE告诉WaitForSingleObject()在特定的事件不处于信号态时不要返回,即把它放在线程的开始的话,那么系统将挂起这个线程,直到事件处于信号态时才继续执行下去。当已经准备好线程继续执行下去的条件时,调用SetEvent(),当线程获得了相应信号态信号后便会继续执行下去。 一旦线程不再被挂起时,它便可以完成相关事务。但若要在主程序中通过线程结束,那么线程必须监视接下来的这个事件,看它是否处于信号态。线程可以通过对事件进行轮询,这时只要调用WaitForSingleObject()即可,只是等待时间参数的值被置为0,即: ::WaitForSingleObject(ThreadBegin.m_hObject,0); 当返回WAIT_OBJECT_0时,表示事件处于信号态,否则处于非信号态。 UINT ThreadProc(LPVOID param) { ::WaitForSingleObject(ThreadBegin.m_hObject,INFINITE); ::MessageBox((HWND)param,"Thread Activated!","Thread",MB_OK); ? BOOL KeepRunning=true; while (KeepRunning) { int Result=::WaitForSingleObject(ThreadEnd.m_hObject,0); if (Result==WAIT_OBJECT_0) KeepRunning=false; } ? ::MessageBox((HWND)param,"Thread Stopped!","Thread",MB_OK); return 0; } 启动线程则用如下代码: HWND hWnd=GetSafeHwnd(); AfxBeginThread(ThreadProc,hWnd); ThreadBegin.SetEvent(); 本文即本人在学习多任务多线程过程的手记,供大家参考,望能得到各位指点。 作者信箱:devvy@21 ? 学习多线程之二:线程同步--使用临界区 作者:惠州市东晓电子有限公司 龚辉斌 下载本文示例源代码 临界区是一种保证在某一时刻只有一个线程能访问数据的简便办法。不管哪一个线程占用临界区对象,它都可以访问受保护的数据,而其他线程就必须等待,直到占用临界区的线程进行释放操作,从而临界区的数据是不会一个以上的线程同一时刻访问的。 在MFC中通过CCtiticalSection类来创建临界区实例,如: CCriticalSection CriticalSection; 当线程准备访问临界区的数据时,必须调用它的成员函数Lock()进行锁定,如: CriticalSecion.Lock(); 如果没有任何线程占用临界区,Lock()可以向调用纯种提供临界区数据的访问,当线程完成各项数据操作后,再调用成员函数UnLock()进行释放,别的线程才可以占用临界区。如: CriticalSection.UnLock(); 可以定义一个数据实例: class CDataArray { private: int iArray[10]; CCriticalSection CriticalSection; public: CDataArray(){}; ~CDataArray(){}; ? void SetData(int iValue); void GetDataArray(int aArray[10]); }; 在头文件中必须包含afxmt.h,它提供了程序对CCriticalSection的访问机制。 void CDataArray::SetData(int iValue) { CriticalSection.Lock(); for

文档评论(0)

docinppt + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档