服务器com+ 返回一个olevariant 数据
function Getdata(a: SYSINT): OleVariant;
但由到数据传递较慢。
所以想到用线程获取。接口是在主程序中产生的。现在的问题是:如何在线程中将这个返回值传回给主程序?thread=class(thread)
private
if: iinterface;
public
constrcutor create(ii: iinterface);override;
procedure thread.execute;
end;constrcutor create(ii: iinterface);override;
begin
if := ii;
end;
procedure thread.execute;
var
ole: olevariant;
begin
//执行到此时提示未初始化CoInitialize,但加了又提示在另一线程中XXXXXXXX....
ole := if.Getdata;
end;该如何将接口的返回值返回给主程序?
如果该方式不合理,望各位不吝赐教。
function Getdata(a: SYSINT): OleVariant;
但由到数据传递较慢。
所以想到用线程获取。接口是在主程序中产生的。现在的问题是:如何在线程中将这个返回值传回给主程序?thread=class(thread)
private
if: iinterface;
public
constrcutor create(ii: iinterface);override;
procedure thread.execute;
end;constrcutor create(ii: iinterface);override;
begin
if := ii;
end;
procedure thread.execute;
var
ole: olevariant;
begin
//执行到此时提示未初始化CoInitialize,但加了又提示在另一线程中XXXXXXXX....
ole := if.Getdata;
end;该如何将接口的返回值返回给主程序?
如果该方式不合理,望各位不吝赐教。
所有访问 com 的程序都要作 CoInitialize 和 CoUninitialize(这个你也要作, 释放 COM 代理)
加也后不行是因为你的对像是在主线程中建立的, COM 对像跨线程是不行的, 要跨得作编组, 不过对你而且没必要这么麻烦, 你只要在线程中建立这个对像就好了, 就是说你 Create改改, 送进服务对像 GUID, 在里面建立就好了吧
function Getdata(a: SYSINT): OleVariant;
返回值传回主线程?可以写成这样吗?
thread=class(thread)
private
if: iinterface;
ole: olevariant;
fole: olevariant;
procdure update;
public
constrcutor create(ii: iinterface;var ole1: olevariant);override;
~~~~~
procedure thread.execute;
end;constrcutor create(ii: iinterface;var ole1: olevariant);override;
begin
if := ii;
ole := ole1;
end;procedure thread.execute;
begin
fole := if.Getdata;
Synchronize(update);
end;procedure update;
begin
ole := fole;
end;
...
public
OnComplete: TNotifyEvent read FOnComplete write FOnComplete; 完成通知, 让调用者自已去挂接接收事件
RetVal: OleVariant read FRetVal; // 定义结果属性
end;execute 不改procedure update; 改成
begin
if Assigned(FOnComplete) then FOnComplete(Self{自已});
end;
调用都这边procedure xxx.DoDownloadComplete(sender: TObject) 事件
begin
(Sender as TyourThread).RetVal; 这个你可以给任何对像
end;
因为不怎么用过thread所以一直在execute、Synchronize这里面想着怎么传,搞得脑子都不灵光了。