是用bde联的吗,如果是多线程的话,也要保证每一个connectioned有唯一的一个session。

解决方案 »

  1.   

    问题是用timer做触发,会不会发生“一个线程查询没有结束,又出现一个新的线程查询”这种情况?试试用个button做触发,看效果如何呢?
      

  2.   

    用Button是可以的,但是我需要实时处理!所以必须用timer,在产生了多个线程之后,每个Query不是独立的吗?
      

  3.   

    可是那样一切都要动态创建,包括query,还要动态建立连接。
    另外不知道你如何处理查询结果,反正就是“不要在工作线程中用datasource,dbgird什么的显示数据”,我这是不是罗嗦了……祝好运!
      

  4.   

    我只是执行SQL,不需要用到datasource,dbgird在主线程显示.可是我试过了TSourceSync.Create(DM1.qryInet,DM1.qrySource,DM1.qrySync,DM1.con);把DataMoudle的连接传到线程中,但在线程里为query设置连接时会出错
    如:
    Constructor TSourceSync.Create(qry1,qry2,qry3:Tadoquery;con:Tadoconnection);
    begin
      treadCon;=con;
      query1.connection:=treadCon    //这句会出错
      ...
    end;
    end;
      

  5.   

    等一等,我也写了一小段代码来测试,
    procedure TForm1.Timer1Timer(Sender: TObject);
    var S : SearchThread;
    begin
      S :=  SearchThread.Create(true);
      showmessage('ok');
      if s.ifQ(ADOQuery1) then
      s.Suspend;
    end;
    可是“ok”能够正常出现(没敢运行太长时间),也是在设计时做的连接。线程里就是一个普通的查询。没发现什么问题。
    你有线程查看的工具吗,看一看,是不是只多了一个线程。
      

  6.   

    我刚刚用Pview95看了一下,线程好象只多不少。
      

  7.   

    我没怎么看你的代码,估计是
    线程同步的问题 
    同意  yansea(思宏)
      

  8.   

    procedure SearchThread.Execute;
    begin
      { Place thread code here }
      if Q<>nil then begin
        Q.Close;
        Q.sql.text := 'select * from zonghe';
        Q.Prepared := true;
        Q.Open;
      end;
    end;//Q是私有变量; Q:TADOQuery;function SearchThread.ifQ(Query: TADOQuery): boolean;
    begin
      result := false;
      Q := Query;
      result := true;
    end; //复值;
      

  9.   

    应该是同步问题,我又死机了……用CreateMutex等什么的控制吧,死的太难看了~~
      

  10.   

    你好szkxy (雨鱼),你的代码如下:
    Constructor TSourceSync.Create(qry1,qry2,qry3:Tadoquery;con:Tadoconnection);
    //前句应写成
    //Constructor TSourceSync.Create(Con:TAdoConnection);
    //adoquery控件在TSourceSync的构造函数中自动创建
    begin
      treadCon;=con;
      query1.connection:=treadCon;
      //以上这句中的query1是不是类TSourceSync的私有变量,
      //如果是应该初始化
      //query1:=tadoquery.create(con);
      //query1.connection:=con
      //不要threadcon做中间变量
      ...
    end;
      

  11.   

    需要为每一个线程使用不同的数据库连接:
    1.如果你使用了BDE,请使用TSession 和TDatabase来管理每一个连接.
    2.如果你使用了ADO,请使用TADOConnection来管理每一个连接.PS:线程不能太多(NT下至多16),否则得不偿失.