Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 在Delphi线程中使用CoInitialize_Multithreading_Delphi_Com - Fatal编程技术网

Multithreading 在Delphi线程中使用CoInitialize

Multithreading 在Delphi线程中使用CoInitialize,multithreading,delphi,com,Multithreading,Delphi,Com,我在Delphi程序的线程中使用TIdHttp和TXMLDocument。 现在我想知道: 这些类是否使用COM对象,因此我需要在此线程中调用CoInitialize和ConInitialize 如果是,我必须在execute方法体中使用这些函数,还是在所有使用TIdHttp或TXMLDocument类的方法中使用这些函数 TIdHTTP没有COM依赖项 TXMLDocument可以依赖于COM。在Windows上,开箱即用,它是Microsoft的MSXML ActiveX组件的包装器,该组

我在Delphi程序的线程中使用TIdHttp和TXMLDocument。 现在我想知道:

  • 这些类是否使用COM对象,因此我需要在此线程中调用CoInitialize和ConInitialize
  • 如果是,我必须在execute方法体中使用这些函数,还是在所有使用TIdHttp或TXMLDocument类的方法中使用这些函数
    • TIdHTTP
      没有COM依赖项

    • TXMLDocument可以依赖于COM。在Windows上,开箱即用,它是Microsoft的MSXML ActiveX组件的包装器,该组件使用COM。如果您使用另一个DOM供应商(例如,OmniXML,可从XE7获得),则不存在COM依赖关系。您可以通过设置全局变量来控制这一点

    • 必须从线程上下文中调用一次
      CoInitialize
      CoUninitialize
      。通常在
      TThread
      Execute()
      方法中,如本示例流所示:

      procedure TMyThread.Execute;
      begin
        try
          CoInitialize(nil);
          try
            while not Terminated do
            begin
              DoWorkThatMayUseCOM;
            end;
          finally
            CoUninitialize();
          end;
        except
          on E: Exception do
            // log exception
            Log(E);
        end;
      end;
      

    谢谢你,爸爸。你的回答非常有用。还有一个问题:当使用不必要的协同初始化调用时,是否存在性能问题?@AmirZojaji:不是真的,在应用程序生命周期中,每个线程只调用一次。