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


 Google 搜索

内容: 
 最新下载包


 
CnWizards 1.1.4.924
[2018-02-22]

 
CnVCL 组件包 20180222
[2018-02-22]

 
CVSTracNT 多语言版 V2.0.1_20080601
[2008-06-02]

 
CVSTrac Linux 中文版 V1.2.1_20060112
[2006-01-12]
  最新开发版下载 RSS
  项目时间线 RSS RSS
 项目相关链接

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

今日首页访问: 784
今日页面流量: 4489
全部首页访问: 3241358
全部页面流量: 11961749
建站日期: 2003-09-01

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

CnPack 开源软件项目 2010-12-06 20:35:39

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

作者:早安·空气

    google的go语言最近挺热的,除了它很酷的语法外,更吸引开发者的是类似coroutine的goroutine,个人觉得它比lua的coroutine更聪明一些,因为它能在运行时自动组合线程和纤程的能力。另外go语言认为线程间的数据应该通过channel通讯,而不是用地址。这些特点非常方便开发稳定的并发式程序,也提供了清晰的并发编程思路。

    go的channel携带一个数据,用于在多个coroutine之间通讯,它容易控制,因为它的规则很简单:没有值时才可以写,否则suspend,有值时才可以读,否则也suspend,并且读写是成对的操作。

    其实go的思想也可以拿到delphi里用,可以用线程模仿goroutine,delphi主要用于客户端开发,所以没有go的高效率也可以接受。下面是一个实际效果的演示,希望它可以给多线程中的delphi程序员提供另一个思路。



{$APPTYPE CONSOLE}

uses
  SysUtils,
  coroutineUnit;

begin
    TProc(procedure()
    var
        c: CChannel<Integer>; //声明一个通道,它可以携带一个整型数据。
        i: Integer;
    begin
    c:=CChannel<Integer>.Create;

    for i:=1 to 5 do  //创建五个任务线程,并立即开始工作。
        go(  //在go语言里,有一个go关键字,用于把一个函数以goroutine方式运行,这里使用了go语言的风格,用一个go函数代替。
            procedure()
            begin
            Sleep(1000);   //假设这个任务比较复杂,花费了一秒时间。
            c.value:=1;     //任务完成后,给通道一个值,这个值是多少在这个示例里不重要,它仅仅是给出一个信号:我完成了
            end);

    for i:=1 to 5 do    //对这五个任务判定是否已完成
        c.value;             //当value有值时,这句才能读到,否则就等待
    Writeln('全部完成');
    c.Free;
    end)();

Readln;
end.

示例代码和coroutineUnit.pas在附件里。
首发cnpack.org
bug反馈:22140505@qq.com


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

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

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

相关主题:


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