我有一个主表单和线程的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调用的异常所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)