继续TEvent,破事真不少

在Windows平台上,TEvent的核心是CreateEvent函数,因此咱们就直奔主题吧。

本来是想测试一下CreateEvent的内存占用的,以为一个THandle只有4个字节(Win32)的内存占用,应该不会有别的事情发生,于是就简单写了以下代码:

procedure TForm1.Button2Click(Sender: TObject);
var
  i, iCount: Integer;
  FEvents: array of THandle;
begin
  iCount := 1024;


  SetLength(FEvents, 1);
  for i := 0 to iCount - 1 do
    FEvents[i] := CreateEvent(nil, True, False, nil);


  Sleep(2000);


  for i := 0 to iCount - 1 do
    CloseHandle(FEvents[i]);
  SetLength(FEvents, 0);

end;

运行一下,然后奇葩的事情就来了,各种花样的AV错误全蹦出来了,还是变着法儿的错误,每次都不一样的那种。。。好吧,我还想着直接用1M的测试呢,这样看来是不行了。

那么问题来了,怎么会这样呢?经查MSDN和网络,也没有什么地方提到这个问题,于是只能自己想当然的解释一下吧:

1.CreateEvent是内核级的函数,应该有限制但MS又没有说(或者可创建的内核对象有限制但我没找到),很多人没遇到自然就不管了。

2.CreateEvent的调度应该是性能优先的,因此很多时候不接受一大堆等不了的事件。

3.CreateEvent更重要的一点是可以同步进程的,自然同2一样,也不大接受一大堆无聊的等待。

所以问题来了,自己编写程序时还是要注意一下CreateEvent的限制,不能想当然的疯狂使用系统资源,说不定哪天莫名其妙就挂了,并且还找不到原因。

以上是自己看到的现象,还没有啥完美解释,只能先记录下来吧。留给其他有需要的同学继续做参考和研究。

最后说一句:其实写原生服务器程序就是自己跟自己狭气,自己给操作系统出难题,各种刁难操作系统,既想让操作系统玩儿命干活又不想让操作系统崩掉。其实操作系统心里想的是:我有一句mmp不知当讲不当讲。。。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值