CnPack 开源软件项目 - 在Delphi XE中使用go语言的并发编程方法之Demo3
  网站首页 下载中心 每日构建 文档中心 捐助我们 开发论坛 关于我们 致谢名单 English


 Google 搜索

内容: 
 最新下载


 
CnWizards 1.5.1.1219
[2024-11-03]

 
CnVCL 组件包 20241103
[2024-11-03]

 
CnPack 密码算法库 20241103
[2024-11-03]
  每日构建版下载
  专家包时间线
 项目相关链接


 
CnPack GitHub 首页
GIT 使用说明
申请加入 CnPack
CnPack 成员名单
 网站访问量

今日首页访问: 143
今日页面流量: 662
全部首页访问: 5292691
全部页面流量: 21319315
建站日期: 2003-09-01

 
在Delphi XE中使用go语言的并发编程方法之Demo3
 
CnPack 开源软件项目 2010-12-12 20:26:23

在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.

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


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

本文已阅读 19207 次
来自: CnPack 开源软件项目

上一主题 | 返回上级下一主题

相关主题:


版权所有(C) 2001-2024 CnPack 开发组 网站编写:Zhou Jinyu