在delphi中使用go语言的并发编程方法,增加demo2
作者:早安·空气
上一篇(论坛原始链接:http://bbs.cnpack.org/viewthread.php?tid=9514&extra=page%3D1)只提供了一个示例,可能不太容易说明什么,这里再增加一个例子。
{这个示例演示了经典的生产消费问题。
go的教程里就这个问题提供了一个Eratosthenes素数筛选法的例子,这里简化一下,演示筛选偶数吧}
我习惯把begin写成同一行,可能很多人不习惯。而这个问题在go语言里消失了,因为它要求{不能换行。
program demo2;
{$APPTYPE CONSOLE}
uses
SysUtils,
coroutineUnit;
//bug反馈:22140505@qq.com
begin
TProc(procedure()
var
i: Integer;
c: CChannel<Integer>; //声明一个通道,它可以携带一个整数,用于在两个线程之间传递
begin
c:=CChannel<Integer>.Create;
go( //启动生产线程
procedure()
var
i: Integer;
begin
for i:=1 to 10 do //制作10个整数作为产品(好弱。。),交给产生线程
c.value:=i;
c.value:=-1; //为-1时表示生产结束了(这属于这个模型的协议,我随意规定的)
end);
go( //启动消费线程,它不停的接收整数产品,判断并输出为偶数的值
procedure()
var
i: Integer;
begin
while true do begin //不停的处理,但cpu消耗不高
i:=c.value; //接收产品,如果没收到,就停在这等
if i=-1 then begin //为-1时表示生产结束了(这属于这个模型的协议,我随意规定的)
c.Free;
break;
end;
if i mod 2=0 then
writeln(inttostr(i));
end;
end);
end)();
Readln;
end.
注:coroutineUnit.pas请见上一篇文章的附件。 |