VC知识库文章 - 学习多线程之一:线程通信--利用事件对象
来源:百度文库 编辑:神马文学网 时间:2024/07/05 15:59:33
学习多线程之一:线程通信--利用事件对象
作者:惠州市东晓电子有限公司 龚辉斌
下载本文示例代码
在线程之间传送信号可以使用事件对象,用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@21cn.com
VC知识库文章 - 学习多线程之一:线程通信--利用事件对象
VC中利用多线程技术实现线程之间的通信
VC中利用多线程技术实现线程之间的通信
VC知识库文章
VC知识库文章
VC知识库文章
深入浅出Win32多线程程序设计之线程通信
WinSock学习笔记(一) - VC知识库文章
VC知识库文章 - VC调试入门
VC知识库文章 - VC Oracle 开发入门
VC知识库文章 - VC++的Unicode编程
VC调试入门 - VC知识库文章
vc知识库文章 - c语言学习方法
VC知识库文章 - WMI 常见问题解答
VC知识库文章 - C 多态技术
VC知识库文章 - Win32串口编程
VC知识库文章 - 常用编码详解
VC知识库文章 - Win32串口编程
缓冲区溢出攻防 - VC知识库文章
Windows消息编程 - VC知识库文章
Windows消息编程 - VC知识库文章123
轻松实现类VC界面 - VC知识库文章
VC进程通信之一:共享存储区
vc知识库文章 - 声明函数指针并实现回调