- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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
您可能关注的文档
- PTN技术简介.doc
- PubMed检索系统.ppt
- QinQ技术简介.doc
- QoS配置命令.doc
- qq可以上网不了.doc
- QQ登录用例测试.doc
- qq空间装扮.doc
- QQ空间设置.doc
- QQ隐身技巧.doc
- Qq飞车音乐列表.doc
- 2022-2023学年山东省临沂市蒙阴县实验中学联考数学试题试卷含解析.doc
- 2022-2023学年安徽舒城桃溪中学高考适应性测试(3月1日)数学试题含解析.doc
- 2022-2023学年安徽省青阳县第一中学高三第五次月考数学试题试卷数学试题含解析.doc
- 牛呼吸道疾病综合征病原PCR检测技术规范.pdf
- 大庆市野生鸟类疫源疫病监测技术规范.pdf
- fresh线性代数作业解决问题.pdf
- 005a1630模拟电子技术基础教学大纲.pdf
- 2022-2023学年安徽省阜阳市临泉县第一中学高三第二次高考模拟考试数学试题试卷含解析.doc
- 2022-2023学年山东省临沂市兰陵县第一中学高三5月联考数学试题含解析.doc
- samsung专有内容可能会更改electrical part list电气零件清单.pdf
文档评论(0)