以前曾发过一个贴子,不过问题有区别,我以前是用线程类来做webservices调用,这个现在没问题.后来另一个项目我就想改成用API(CreateThread)来建线程,感觉还简单些,不过问题来了,
httprio是在线程里动态生成的,这个是个接口类,不用free,引用计数为0会自动释放,但还有一个东西,
WebServiceSoap = interface(IInvokable);
上面这个,WebServiceSoap 是导入的WSDL生成的远程接口方法,在客户端我需要先定义一个此接口方面的变量,然后把httprio转成这个,下面是这一段的代码(问题就在这一段). HTTPRIO1:=THTTPRIO.Create(nil);
HTTPRIO1.HTTPWebNode.Agent:='Borland SOAP 1.2';
HTTPRIO1.HTTPWebNode.UseUTF8InHeader:=True;
HTTPRIO1.WSDLLocation:= WebServiceSoap_location; //此为一个常量,为webservices的地址 SWebServiceSoap := (HTTPRIO1 as WebServiceSoap);
sWebServiceSoap := GetWebServiceSoap(False,WebServiceSoap_location,HTTPRIO1);
try
k := SWebServiceSoap.AddHJ_SPECIAL(ZYX_DATA);SWebServiceSoap :WebServiceSoap;
开始我把SWebServiceSoap 变量的声明放在线程函数内,不行,到sWebServiceSoap := GetWebServiceSoap(False,WebServiceSoap_location,HTTPRIO1);就会出错,后改成全局变量放在implementation下面,就可以传输数据了,不过常常运行个一天程序就会自已死掉,网上找了很多都没找到原因,看到一个讲接口要为nil,我又在用完后把SWebServiceSoap :=nil;
更不行,死得更快.就不知为什么了,但我在线程类里面把SWebServiceSoap :WebServiceSoap;放在线程类的private区里,程序就没有问题,放在外面全局也是一样,要死,那问题就是这个SWebServiceSoap 可能该如何释放的问题,可我用API就不知道该如何做,请教一下.分实在不多,多谢了.
httprio是在线程里动态生成的,这个是个接口类,不用free,引用计数为0会自动释放,但还有一个东西,
WebServiceSoap = interface(IInvokable);
上面这个,WebServiceSoap 是导入的WSDL生成的远程接口方法,在客户端我需要先定义一个此接口方面的变量,然后把httprio转成这个,下面是这一段的代码(问题就在这一段). HTTPRIO1:=THTTPRIO.Create(nil);
HTTPRIO1.HTTPWebNode.Agent:='Borland SOAP 1.2';
HTTPRIO1.HTTPWebNode.UseUTF8InHeader:=True;
HTTPRIO1.WSDLLocation:= WebServiceSoap_location; //此为一个常量,为webservices的地址 SWebServiceSoap := (HTTPRIO1 as WebServiceSoap);
sWebServiceSoap := GetWebServiceSoap(False,WebServiceSoap_location,HTTPRIO1);
try
k := SWebServiceSoap.AddHJ_SPECIAL(ZYX_DATA);SWebServiceSoap :WebServiceSoap;
开始我把SWebServiceSoap 变量的声明放在线程函数内,不行,到sWebServiceSoap := GetWebServiceSoap(False,WebServiceSoap_location,HTTPRIO1);就会出错,后改成全局变量放在implementation下面,就可以传输数据了,不过常常运行个一天程序就会自已死掉,网上找了很多都没找到原因,看到一个讲接口要为nil,我又在用完后把SWebServiceSoap :=nil;
更不行,死得更快.就不知为什么了,但我在线程类里面把SWebServiceSoap :WebServiceSoap;放在线程类的private区里,程序就没有问题,放在外面全局也是一样,要死,那问题就是这个SWebServiceSoap 可能该如何释放的问题,可我用API就不知道该如何做,请教一下.分实在不多,多谢了.
如果說您用的是synchronize(run),那麼:
Synchronize(Run)是会阻塞的。用Run,你的错误原因在于多个线程同时访问某一控件,即一块内存被同时读写,你要使用互斥。互斥明白吗?不明白GOOGLE或csdn里搜索一下,例子大把,几句话,很简单的,但是要注意,不要被锁死。就是当某个线程正在访问某控件的时候,就要锁住,不要让其它线程访问,当前线程访问完毕之后解锁,让其它线程访问....
CoInitialize(nil); // 手动调用 CoInitialize()
OleInitialize(nil);
finalization
CoUnInitialize; // 释放内存
try
OleUninitialize;
except
end;
加上这个了没?