Chinaunix首页 | 论坛 | 博客
  • 博客访问: 415582
  • 博文数量: 54
  • 博客积分: 1186
  • 博客等级: 少尉
  • 技术积分: 668
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-11 04:57
文章分类

全部博文(54)

文章存档

2013年(1)

2012年(6)

2011年(47)

我的朋友

分类: BSD

2011-05-03 03:32:19

  1. //线程池结束
  2. procedure TThreadsPool.Finished;
  3. var
  4.     bRet:LongBool;
  5. begin
  6.     repeat
  7.         bRet := SetEvent( FWaitEvent );
  8.     until bRet;

  9.     repeat
  10.         //线程池完成标记
  11.         PoolFineTag := True;
  12.     until PoolFineTag;
  13.     
  14. end;


  15. procedure TThreadsPool.WaitFor;
  16. var
  17.     hHandle:THandle;
  18. begin
  19.     PoolFineTag := False;
  20.     
  21.     FWaitEvent := CreateEvent(nil, True, False, nil);

  22.     while True do
  23.     begin
  24.         hHandle := WaitForSingleObject( FWaitEvent, 100 );

  25.         if ( hHandle = WAIT_OBJECT_0 ) or ( PoolFineTag ) then
  26.         begin
  27.             Break;
  28.         end;

  29.         //Sleep( 100 );
  30.     end;

  31.     CloseHandle( FWaitEvent );
  32.     FWaitEvent := 0;
  33. end;
这两个函数的作用是在WaitFor中设置阻塞,在Finished中取消阻塞,本来最初两个最关键的地方设置如下:

WaitForSingleObject( FWaitEvent, INFINITE );
SetEvent( FWaitEvent );

按理说这样WaitForSingleObject应该不会永远阻塞吧!但在测试中却发现,有时SetEvent会返回False,所以不得已,把SetEvent放在了循环体中。但是,SetEvent设置成功后,WaitForSingleObject却依然可能永远阻塞,所以又加了了PoolFineTag变量,将WaitForSingleOjbect的第二个参数设置为0。但是,WaitForSingleObject却一直超时,而PoolFineTag为False。所以又将PoolFineTag的设置放入循环体,虽然在改为以前代码后,暂时还没发现一直阻塞的问题,但总觉得问题不应该是这样解决的。
阅读(1461) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~