web-services – 从线程调用远程SOAP调用的异常

web-services – 从线程调用远程SOAP调用的异常,第1张

概述这是我几分钟前问过的 this question的扩展/下一步. 我有一个主表单和线程的Delphi应用程序.每隔X秒,线程就会对远程对象发出Web服务请求.然后它回发到主窗体,它处理用新信息更新UI. 我以前在我的线程中使用了TTimer对象,当TTimer回调函数运行时,它在主线程的上下文中运行(但远程Web服务请求确实有效).这反而破坏了单独线程的目的,所以我现在在我的线程的Execute函 这是我几分钟前问过的 this question的扩展/下一步.

我有一个主表单和线程的Delphi应用程序.每隔X秒,线程就会对远程对象发出Web服务请求.然后它回发到主窗体,它处理用新信息更新UI.

我以前在我的线程中使用了TTimer对象,当TTimer回调函数运行时,它在主线程的上下文中运行(但远程Web服务请求确实有效).这反而破坏了单独线程的目的,所以我现在在我的线程的Execute函数中有一个简单的循环和睡眠例程.问题是,从GetIMySOAPService()返回时会抛出异常.

procedure TPollingThread.Execute;varSystemStatus : TCWRSystemStatus;beginwhile not Terminated  dobegin  sleep(5000);  try    SystemStatus := GetIMySOAPService().GetSystemStatus;    PostMessage( ParentHandle,Integer(APISystemStatus),Integer(SystemStatus),0 );    SystemStatus.DataContext := nil;    LParam(SystemStatus) := 0;  except  end;end;end;

任何人都可以建议从线程调用此函数时为什么抛出此异常?我敢肯定我会忽略一些基本而简单的东西.

谢谢,邓肯

解决方法 在Execute()方法中,必须调用CoInitialize和CoUnitialize来设置和拆除COM库.

您的主线程在Application.Initialize()过程中自动执行此 *** 作,但是,其他线程在调用COM函数之前需要调用CoInitialize.

确保在Execute()方法中而不是在构造函数中调用CoInitialize,因为构造函数在父线程(通常是主线程)中执行.那不是你需要它的地方.必须从您计划进行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 somethingend;

这允许您在错误初始化时捕获错误,并确保您调用CoUninitialize.

总结

以上是内存溢出为你收集整理的web-services – 从线程调用远程SOAP调用的异常全部内容,希望文章能够帮你解决web-services – 从线程调用远程SOAP调用的异常所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1075275.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存