这是一个扩展/下一步这个问题 https://stackoverflow.com/questions/2538655/should-i-free-a-delphi-object-auto-instantiated-from-a-web-services-call我几分钟前问过。
我有一个带有主窗体和线程的 Delphi 应用程序。每隔 X 秒,线程就会向远程对象发出 Web 服务请求。然后它回传到主窗体,主窗体负责使用新信息更新 UI。
我之前在线程中使用了 TTimer 对象,当 TTimer 回调函数运行时,它在主线程的上下文中运行(但远程 Web 服务请求确实有效)。这相当违背了单独线程的目的,因此我现在在线程的执行函数中有一个简单的循环和睡眠例程。问题是,从 GetIMySOAPService() 返回时会引发异常。
procedure TPollingThread.Execute;
var
SystemStatus : TCWRSystemStatus;
begin
while not Terminated do
begin
sleep(5000);
try
SystemStatus := GetIMySOAPService().GetSystemStatus;
PostMessage( ParentHandle, Integer(apiSystemStatus), Integer(SystemStatus), 0 );
SystemStatus.DataContext := nil;
LParam(SystemStatus) := 0;
except
end;
end;
end;
任何人都可以建议为什么从线程调用此函数时会引发此异常?我确信我忽略了一些基本且简单的事情。
谢谢,邓肯
In your Execute()
方法,你必须调用CoInitialize
and CoUnitialize
设置和拆除 COM 库。
你的主线程会自动在Application.Initialize()
过程,但是,其他线程需要调用CoInitialize
在调用 COM 函数之前。
确保您致电CoInitialize
in the Execute()
方法而不是在构造函数中,因为构造函数是在父线程(通常是主线程)中执行的。那不是你需要它的地方。必须从您计划从中进行 COM 调用的线程调用它。
我建议使用这种格式:
try
// OleCheck will raise an error if the call fails
OleCheck(CoInitializeEx(NIL, COINIT_MULTITHREADED or COINIT_SPEED_OVER_MEMORY));
try
// Do work here
finally
CoUninitialize;
end;
except
// We failed, do something
end;
这允许您在初始化失败时捕获错误并确保您调用CoUninitialize
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)