在idtcpserver的OnExecute事件中根据客户端传来的指令,
使用一个全局变量ADOQuery控件从数据库中获取数据返回给客户端。在一开始的时候,说没有调用Coinitialize(nil)所以不成功,然后加上之后可以成功了。
但是由于sql语句执行时间很长,在一个客户端执行的期间,另一个客户端又要求执行这个指令,
此时就返回错误:“在异步运行时,操作不能被执行。”这样就只能同一时间只能处理一个客户端的需求了。应该怎样解决呢?谢谢

解决方案 »

  1.   

    没有问题呀,它idtcpserver的OnExecute本身就是多线程的,你不必考虑,我的项目好几百个客户端也没有问题呀,不过你的ADOQuery要跟多线程对应起来,比如用数组,你看看它的IndyDemos,好像再ImageServer里面,我用的是indy9.0这里都有下载:
    http://www.indyproject.org/download/Files/Indy9.html
      

  2.   

    to:2312(╰@oo恒星★)  :但是目前确实是出现了错误:“在异步运行时,操作不能被执行。”,是不是因为ADOQuery1是Form1上的控件,所以同一时间只能供一个客户端使用?应该如何处理呢?help!!
      

  3.   

    大家周末都休假了?呜呜~~~
    这个问题解决不了,我就只能空等了,无法做下去啊。help!!
      

  4.   

    可能,这样服务器的ADOQuery用数组控件,都动态创建,跟多线程对应起来
      

  5.   

    你的ADOQuery控件也要是多线程的,动态创建吧,和idTCPServer对应起来。
      

  6.   

    使用一个全局变量ADOQuery控件从数据库中获取数据返回给客户端。
        ~~~~~~~~~~~~~~~~~~~~楼主应该在线程运行时候,创建本线程自己的adoquery
      

  7.   

    procedure TServerMainFrm.IdTCPServer1Execute(AThread: TIdPeerThread);
    var
      ADOConnection: TADOConnection;
      ADOQuery: TADOQuery;
    begin
      //
      CoInitialize(nil);  ADOConnection := TADOConnection.Create(Nil);
      ADOConnection.ConnectionString := Connstr;
      ADOConnection.Open;  ADOQuery := TADOQuery.Create(Nil);
      ADOQuery.Connection := ADOConnection;
      ADOQuery.SQL.Text := '***';
      ADOQuery.Open;
      ADOQuery.Close;
            
      //...  FreeAndNil(ADOQuery);
      FreeAndNil(ADOConnection);  CoUnInitialize;
      
      AThread.Connection.Disconnect;
    end;