XXXX指的是什么?
我想线程中是应该可以用clientdataset的,而且你现在的问题也不一顶是它的原因

解决方案 »

  1.   

    XXXX = Variant,具体错误没记下来肯定是线程的问题,你不用怀疑了.
    我在主线程中调用Execute是可以正常执行的.有些控件是不支持线程安全的, 我只是想知道有没有可能在线程中使用TClientDataSet.
      

  2.   

    具体错误是Project xxx.exe raised exception class EAccessViolation with message' Access violation at address .................Write of address 0000030. Process stoped Use step or .....很常见的错误提示,另外我连接的是SQL server 2000
      

  3.   

    看看tclientdataset的fetchondemand是否为true
      

  4.   

    应该可以把,我还没试过,估计可能需要调用CoInitialize()
      

  5.   

    我写了如下代码进行测试,没有发生任何问题。
    unit Unit2;interfaceuses
      Classes, DBClient;type
      TrdABC = class(TThread)
      private
        { Private declarations }
        fCDS:TClientDataset;
      protected
        procedure Execute; override;
      end;implementation
    uses
      ActiveX, DB;
    { Important: Methods and properties of objects in VCL or CLX can only be used
      in a method called using Synchronize, for example,      Synchronize(UpdateCaption);  and UpdateCaption could look like,    procedure TrdABC.UpdateCaption;
        begin
          Form1.Caption := 'Updated in a thread';
        end; }{ TrdABC }
    procedure TrdABC.Execute;
    begin
      FreeOnTerminate:=true;
      CoInitialize(nil);
      try
        fCDS:=TClientDataset.Create(nil);
        try
          with FCDS.FieldDefs.AddFieldDef do
          begin
            DataType:=ftInteger;
            Name:='ID';
          end;
          fCDS.CreateDataSet;
          { Place thread code here }
        finally
          fCDS.Free;
        end;
      finally
        CoUnInitialize;
      end;
    end;end.
      

  6.   

    to Miracle()看了你的例子, 发现对我没什么用, 因为你只是在线程中建立了本地的数据集
    而我是要从无端数据源取数据集,不用CoInitialize也可以,ClientDataSet并没用到Ole接口 , 我想不用初始化的.我的程序中也可以线程中操作本地数据集, 但不能在线程中发送CommandText到服务器.我要求的是
    procedure TrdABC.Execute;
    begin
      FreeOnTerminate:=true;
      fCDS:=TClientDataset.Create(nil);
        try
          with FCDS do
          begin
            Close();
            CommandText := 'SELECT * FROM .....';
            Open(); //线程中执行这里会出错
          end;
        finally
          fCDS.Free;
        end;
      

  7.   

    呵呵,我一般不这样用。因为多数Delphi所创建的MIDAS服务器都是STA(Single-Threaded Apartment)的,每个Apartment只能有一个线程进入,而且中途不允许换人,你这样在多线程中呼唤STA服务器当然无法正确执行。除非你做到在同一个线程中初始化服务器连接-转换服务器接口等一些列操作,或者自己手工编写线程间的转换(Marshaling)代码,又或者把服务器写成MTA,否则注定无法成功的。
      

  8.   

    还有,你上面的例子,好像没有设置RemoteServer和Provider,是为了示意而省略了?
      FreeOnTerminate:=true;
      fCDS:=TClientDataset.Create(nil);
        try
          with FCDS do
          begin
            Close();
            CommandText := 'SELECT * FROM .....';
            Open(); //线程中执行这里会出错
          end;
        finally
          fCDS.Free;
        end; 
      

  9.   

    又及,使用ClientDataset会调用Midas.dll中的服务,也就是说使用了COM,所以在独立线程中处理ClientDataset时,最好使用CoInitialize。
      

  10.   

    我是省略了我还试过将SocketConnection也封装在线程类中, 但还是一样.
    看来是没办法了我会给分的
      

  11.   

    呵呵,因为以前很少来CSDN,我现在一共才171分,如果你给我300,我可真是发了……
      

  12.   


    TO :CROB 
    >>'''ClientDataSet并没用到Ole接口 
    不会吧.你自己看源码,ClientDataSet是离不开COM 接口的.关于类似的问题, 其实早有贴子已经讨论得比较成熟了.
    可以参见
    http://www.csdn.net/expert/topic/177/177973.shtm
      

  13.   

    在线程创建CONNECTION连接(socket或DCOM)是必须的.
    超过一个线程,
    CoInitializeEx 不是最好要用..而是必须要用.