Board logo

Subject: 在delphi中使用go语言的并发编程方法,增加demo3 [Print This Page]

Author: zzzl    Time: 2010-12-1 16:13     Subject: 在delphi中使用go语言的并发编程方法,增加demo3

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.

Attachment: coroutineUnit.zip (2010-12-1 16:13, 930 bytes) / Download count 87
http://bbs.cnpack.org/attachment.php?aid=789
Author: Passion    Time: 2010-12-6 20:47

附件中只有coroutineUnit.pas,没有相应的dpr文件?
Author: zzzl    Time: 2010-12-10 10:11



Attachment: demo_timeout.rar (2010-12-10 10:11, 838 bytes) / Download count 81
http://bbs.cnpack.org/attachment.php?aid=794
Author: friendlinzh    Time: 2011-8-18 10:22

多谢分享啊




Welcome to CnPack Forum (http://bbs.cnpack.org/) Powered by Discuz! 5.0.0