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