Chinaunix首页 | 论坛 | 博客
  • 博客访问: 367655
  • 博文数量: 715
  • 博客积分: 40000
  • 博客等级: 大将
  • 技术积分: 5005
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-13 14:46
文章分类

全部博文(715)

文章存档

2011年(1)

2008年(714)

我的朋友

分类:

2008-10-13 16:40:32

学习多线程之一:线程通信--利用事件对象
作者:



在线程之间传送信号可以使用事件对象,用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
--------------------next---------------------

当反复创建这一线程时,程序内存占用会不断增加,…… ( shliwan 发表于 2006-5-21 19:59:00)
 
这里的代码联接是错的

这才是对的! ( lhongliangi 发表于 2004-3-4 14:55:00)
 
我想的是一进入系统就开始读数据库,进度条就会显示其读写情况.读完后进度条显示完成,然后

其数据就添加在LIST控件中.如果没有进度条显示其进度要读7万条的记录程序就好象死机

能否给个线程的例子!
我做个例子不成功,请教!!
void CNEWADODlg::OnBUTTONProgressCtrl() 
{
  int ii;
  int BB;
  BB=m_pRecordset->RecordCount;
  m_ProgressCtrl.SetRange(0,BB);
  for(ii=0;ii<=BB;ii++)
   {
     m_ProgressCtrl.SetPos(ii);
   }
}
( hjw21 发表于 2003-11-27 9:23:00)
 
那个while循环会不会很占资源? ( musicfan 发表于 2003-6-24 13:58:00)
 
你好,我在做一个工控程序用到过你说过的方法,监测一块板卡的脉冲信号,在低速时效果还可以,但达到当频率达到100K以后,就有问题了,监测不准,需要加入一定的偏差量才可以,但有时候误差就比较大了,累计以后就达不到要求拉,不知道你试过没有,也向想你请教一下。 ( wuyuebear 发表于 2003-6-23 9:11:00)
 
.......................................................

--------------------next---------------------

阅读(162) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~