学习多线程之一:线程通信--利用事件对象 下载本文示例代码 CEvent ThreadBegin;
事件被创建后就自动处于非信号态,要使用它处于信息态,必须使用对件对象的成员函数SetEvent(),即: ThreadBegin.SetEvent();
线程监视这个信号来知道事件已准备就绪,从而可以进行其它的操作。而线程通过调用API函数WaitForSingleObject()来监视这个信号。 ::WaitForSingleObject(ThreadBegin.m_hObject,INFINITE);
该函数的两个参数分别表示要检查的事件句柄与函数等待事件时间。 一旦线程不再被挂起时,它便可以完成相关事务。但若要在主程序中通过线程结束,那么线程必须监视接下来的这个事件,看它是否处于信号态。线程可以通过对事件进行轮询,这时只要调用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(); |
|
|
![]() http://www.vckbase.com/code/winsys/mtask/Thread1_23.zip 这才是对的! ( 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) ![]() ![]() ....................................................... More... |
|
|
|
|
评论