以前曾发过一个贴子,不过问题有区别,我以前是用线程类来做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就不知道该如何做,请教一下.分实在不多,多谢了.

解决方案 »

  1.   

    不知道您用的是哪種方式調用和封裝使用的?
    如果說您用的是synchronize(run),那麼:
    Synchronize(Run)是会阻塞的。用Run,你的错误原因在于多个线程同时访问某一控件,即一块内存被同时读写,你要使用互斥。互斥明白吗?不明白GOOGLE或csdn里搜索一下,例子大把,几句话,很简单的,但是要注意,不要被锁死。就是当某个线程正在访问某控件的时候,就要锁住,不要让其它线程访问,当前线程访问完毕之后解锁,让其它线程访问....
      

  2.   

    vcl不是线程安全吧,需要用Synchronize来访问可视
      

  3.   

    楼上两位没仔细看说明吧,httprio是线程里动态创建的,上面都有说明的啊,我这个不需要同步的.
      

  4.   

    这个问题很高难度吗?我自已顶一下,一天都没几个回贴,CSDN是不行了.
      

  5.   

    initialization
      CoInitialize(nil); // 手动调用  CoInitialize()
      OleInitialize(nil);
    finalization
      CoUnInitialize; // 释放内存
      try
        OleUninitialize;
      except
      end;
    加上这个了没?