程
程云
Unregistered / Unconfirmed
GUEST, unregistred user!
没想到Delphi在线程安全方法作的会这么差。
我现设一列表对象 AList: TStrings
我有多个线程来来维护这个列表,
TOnCap = procedure(S: String) of object;
TCYThread = class(TThread)
private
FOnCap: TOnCap;
protected
procedure Execute;
override;
public
property OnCap: TOnCap read FOnCap write FOnCap;
end;
是通过TCYThread线程的property OnCap事件中写程序来,这时这个事件需要带个参数,
procedure OnCap(S: String),
要完成的任务就是先在这个列表(AList: TStrings)中查找是否有这个字符串,
如没有,就添加上,
可假设同时有两个以上带有同一个字符串的线程去访问这个列表(AList: TStrings),
它们很可能会在发现这里没有这个值而同时为这个列表(AList: TStrings)加入这个值,
结果造成列表列项重复。
查资料得知,VCL在线程安全方面是个大缺陷,
关有两种方法可解决,
第一种:使用同步函数Synchronize来进行排队,写法如下:
procedure Execute
begin
Synchronize(OnCap(sTemp))
end;
可是Synchronize这个破函数不支持有参数的过程。
第二种:PostMessage向那个对象发消息,使用Windows的消息队列来完成,
这个好象也不好,因为,有可能我要写很多各种各样的参数,
这根本解决不了问题。
嗨!为何傻乎乎的Borland会出这么多错。
有没有好办法解决?
我现设一列表对象 AList: TStrings
我有多个线程来来维护这个列表,
TOnCap = procedure(S: String) of object;
TCYThread = class(TThread)
private
FOnCap: TOnCap;
protected
procedure Execute;
override;
public
property OnCap: TOnCap read FOnCap write FOnCap;
end;
是通过TCYThread线程的property OnCap事件中写程序来,这时这个事件需要带个参数,
procedure OnCap(S: String),
要完成的任务就是先在这个列表(AList: TStrings)中查找是否有这个字符串,
如没有,就添加上,
可假设同时有两个以上带有同一个字符串的线程去访问这个列表(AList: TStrings),
它们很可能会在发现这里没有这个值而同时为这个列表(AList: TStrings)加入这个值,
结果造成列表列项重复。
查资料得知,VCL在线程安全方面是个大缺陷,
关有两种方法可解决,
第一种:使用同步函数Synchronize来进行排队,写法如下:
procedure Execute
begin
Synchronize(OnCap(sTemp))
end;
可是Synchronize这个破函数不支持有参数的过程。
第二种:PostMessage向那个对象发消息,使用Windows的消息队列来完成,
这个好象也不好,因为,有可能我要写很多各种各样的参数,
这根本解决不了问题。
嗨!为何傻乎乎的Borland会出这么多错。
有没有好办法解决?