to njbudong(南京不懂) 不能断开连接,否则性能相差太大了。起码相差10倍以上。因为如果断开连接,我还不如在线程中再建立mts对象,但是如果每个线程都建立mts对象,建立过程起码要花好几秒钟,对于我的应用,不能承受

解决方案 »

  1.   

    跨机器调用dcom狠痛苦,我不太明白你的主进程是什么意思,你本机com是什么线程模式?
      

  2.   

    to a_fee
    不是dcom,而com+(或者说mts)。我的主进程字的是程序所在的进程,这个进程产生了不少线程,这些线程需要调用主进程的com+资源。如果把这些com+的调用全部放到线程中去,在线程中会带来严重的性能问题。
      

  3.   

    我也碰到过类似问题,后来发现调用CreateRemoteComObject前必须先调用CoInitialize初始化一下,一般应用中Application已经隐含调用了CoInitialize,但在线程中应该显式调用CoInitialize,把程序改成以下形式,应该不会出现原来的错误,另外你的线程的用法不大赞成,把所有操作都用Synchronize保护起来,这样可能会效率较低,其实把操作主线程的VCL的代码保护起来就可以了,以上纯属个人观点,有不对的地方还望知情者点拨,谢谢!function TForm1.sjjs:string; 
    //数据检索:根据提供的sql语句检索数据 
    //sql:需要检索的sql语句,应该是一个select语句 
    var 
      oleSjj:OleVariant;//返回的数据集 
      dtstSjj:TClientDataset; 
      IJk1:IUnknown; 
      IMTS:ISwxtdx;//应用服务器mts接口 
    begin 
      CoInitialize(nil);//初始化
      IJk1:=CreateRemoteComObject('10.68.7.7',CLASS_Swxtdx);//创建MTS对象 
      IMTS:=IJk1 as ISwxtdx; 
      dtstSjj:=TClientDataset.Create(nil); 
      try 
        IMTS.Sjjs('select * from yxgl.hcs',oleSjj);//调用服务器的方法取得数据 
        dtstSjj.Data:=oleSjj; 
        dtstSjj.CommandText:='select * from yxgl.hcs'; 
        result:=inttostr(dtstsjj.recordcount); 
      finally 
        dtstsjj.Free; 
      end; 
      CoUninitialize();//结束
    end; 
      

  4.   

    to  newwen(wen) 
    对不起,在拷贝示例代码时,有误,应该是下面的代码。TForm1 = Class(TForm);
    protected
    .....
    private
    .....
    public
      imts:ISwxtdx;//应用服务器mts接口 
      ...
    end;procedure TForm1.Create(Aonwer:TComponent);
    var 
      IJk1:IUnknown; 
    begin
      //mts是在这里产生的,之所以在这里产生,是考虑到,如果在访问mts时才建立对象的话,
      //性能太低了,因为我对mts资源的访问相当频繁。而我的程序要求线程中的代码必须有
      //很高的性能,否则我就在mts中直接产生mts对象了
      Inherited Create(Aowner);
      
      CoInitialize(nil);//这是按照你的意见修改的,我发现无论有没有这一句,都有错误  IJk1:=CreateRemoteComObject('10.68.7.7',CLASS_Swxtdx);//创建MTS对象 
      IMTS:=IJk1 as ISwxtdx; 
    end;procedure TForm1.destroy;
    begin
      CoUninitialize();//这是按照你的意见修改的,end;function TForm1.sjjs:string; 
    //数据检索:根据提供的sql语句检索数据 
    //sql:需要检索的sql语句,应该是一个select语句 
    var 
      oleSjj:OleVariant;//返回的数据集 
      dtstSjj:TClientDataset; 
    begin 
      dtstSjj:=TClientDataset.Create(nil); 
      try 
        IMTS.Sjjs('select * from yxgl.hcs',oleSjj);//调用服务器的方法取得数据 
        dtstSjj.Data:=oleSjj; 
        dtstSjj.CommandText:='select * from yxgl.hcs'; 
        result:=inttostr(dtstsjj.recordcount); 
      finally 
        dtstsjj.Free; 
      end; 
    end; procedure TForm1.Button1Click(Sender: TObject); 
    begin 
      tjmsx.Create(false); 
    end; procedure tjmsx.Execute; 
    begin 
      Synchronize(jmtz); 
    end; procedure tjmsx.Jmtz;//界面调整过程 
    var 
      m:string; 
    begin 
      m:=form1.sjjs; 
      form1.caption:=m; 
    end; 
      

  5.   

    你这样写就不必 CoInitialize了,你的mts对象只创建了一次,用线程并不能解决效率,你的两种情况(线程内外创建mts对象)我都做过,一切都很正常啊,是不是你的MTS的线程模式有问题,试试同时启动两个进程有没有问题
      

  6.   

    同时多人使用系统没有问题。我是delphi5开发的,是both模型