在Delphi XE中使用go语言的并发编程方法之Demo3

减小字体 增大字体 作者:佚名  来源:转载  发布时间:2011-02-16 14:58:06

这个例子演示了如何实现超时控制

program demo3;

{$APPTYPE CONSOLE}

uses
  SysUtils,Generics.Collections,
  coroutineUnit;

//这个例子演示了如何实现超时控制

var
    cWork, cTimeout: CChannel<Integer>; //声明两个通道,各用于工作和超时
    ret: tpair<Integer, Integer>; //后面有讲到
begin
cWork:=CChannel<Integer>.create;
cTimeout:=CChannel<Integer>.create;

go(procedure() //起动工作线程
    var
        i: Integer;
    begin
    sleep(1010);  //假设这个工作费时1010毫秒
    try
        cWork.value:=1;  //发通道发送一个值,表示工作完成了。
    except
        end;
    end);

go(procedure()  //起动一个线程用来计时
    begin
    sleep(1000);  //假设超时等待时间是1秒
    cTimeout.value:=1000; //...
    end);

{直到cWork,cTimeout这两个通道至少有一个可读取,获取通道的结果,结果是个pair,其中key描述了哪个通道有响应,value描述了通道的值(对这个select的模仿远没有go语言的幽雅,也许以后会有更好的办法)}
ret:=CCoroutine.select<Integer>([cWork, cTimeout]);  
case ret.key of  //判断是哪个通道可读
    0:    Writeln('完成');  //如果是第0个,就是cWork的信号了,表示在超时等待之前工作完成了。
    1:    Writeln('超时'+inttostr(ret.value));  //...
    end;

cWork.Free;
cTimeout.Free;
Readln;
end.

注:coroutineUnit.pas请见上一篇文章的附件。


相关下载:
在Delphi XE中使用go语言的并发编程方法的例子之三 

来源:http://www.cnpack.org/showdetail.php?id=698&lang=zh-cn

Tags:

作者:佚名
  • 好的评价 如果您觉得此文章好,就请您
      0%(0)
  • 差的评价 如果您觉得此文章差,就请您
      0%(0)

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论

广告位置B