如何写一个WaitForData的函数?Function WaitForData(TimeOut: Integer): Integer;之前在 Win32 环境下原本有 SocketStream.WaitForData 函数可用,移植到 .Net 环境后,似乎就没有相同的功能可用了(或许只是我不知道),因此到这里来询问一下有没有人知道怎么做﹖我简单说明一下,这个函数的功能很简单,函数内不断的去读 Avaiable 这个函数,如果 Avaiable = True, 则 WaitForData 函数返回 True. 否则,若 TimeOut 时间到了,Avaiable 仍然是 False 的话,则 WaitForData函数返回 False.我试着写一段程式如下:function TMyObject.WaitForData(TimeOut: Integer): Integer;
begin
TimeUp:=False;
FMyTimer.Interval:=TimeOut;
FMyTimer.Enabled:=True;
while (not Avaible) and (not TimeUp) do
begin
Sleep 500;
end;
result:=Avaible;
end;程式说明如下: 1.TimeUp是FMyObject 的一个 Property。
2.一开始,先将 TimeUp 设为 False。
3.设定 FMyTimer: TTimer 在 TimerOut 时间后触发 OnTimer 事件。
4.FMyTimer 时间到时,将 TimeUp 设为 True.
5.While Loop 内放了一个 Sleep 500 的目的是希望它每一Loop睡0.5秒,少用一点资源,不要把系统绑死了。不知道各位对于我上面的程序实践,有没有更好的想法,提出来让我参考一下,谢谢各位了。

解决方案 »

  1.   

    我想问一下,这样子的代码能保证你的OnTimer事件过程正常执行吗?真有点怀疑。
      

  2.   

    unsigned: 嗯,好提醒,我还没有写程序写到这里,写到并测试后,我会回答你。谢谢!
      

  3.   

    unsigned: 如果 Timer 无法正常执行,我打算改成下列的做法,
    1.一进入函数,把系统时间记起来,
    2.在Loop内每一圈都测试当时时间与系统时间的差,若大于TimeOut,则结束程式.
    因此,经过修改后如下:function TMyObject.WaitForData(TimeOut: Integer): Integer;
    begin
    SaveSystemTime;//函数,存储系统时间
             //下行的DiffTimeWithSystemTime是另一个函数,返回比较时间差
    while (not Avaible) and (DiffTimeWithSystemTime<TimeOut) do
    begin
    Sleep 500;
    end;
    result:=Avaible;
    end;
      

  4.   

    我自己在乎的地方主要在
    1.Sleep 500的做法有点笨。虽然可以把Sleep 500改小一点,例如Sleep 100,如此程序速度较好,但用资源较多.
    2.不知道有Sleep 500/100 的存在,是否会影响大量资料的读取。如果资料源源不断地来,则不应有Sleep 500/100的存在,如此才能保存程序执行速度。我在该不该拿掉这一行有点犹豫。各位给一下意见吧!
      

  5.   

    我的意思是,在这个循环里面,如何能够让你的Timer控件能够响应OnTimer消息。这才是我所关心的。
      

  6.   

    不好意思啊,呵呵,我是菜鸟,在.Net 环境下select函数不能用了吗?
      

  7.   

    To gemouzhi, 好提议,我找了一下MSDN,Socket Class確實有select方法,可以解決我的問題,謝了。