使用indy的TIdTcpClient将数据从客户端发送到使用TIdTcpServer的服务端。主窗口中放置TIdTcpServer控件,其OnExecute方法如下:TMainForm=class(TForm)
...
// 主窗口中的方法,其中strOut为传出变量
procedure TMainForm.Func(strIn:String; var strOut:String);
begin
  ...
  //根据传入的strIn,计算,返回strOut
end;// TIdTcpServer的OnExecute方法
procedure TMainForm.TcpOnExecute(AThread:TIdPeerThread)
var
   con:TAdoConnection;
   strIn,strOut:String;
begin
   con := TAdoConnection.Create(self);
   ...
   //调用主线程的方法
   Func(strIn,strOut);   //保存数据操作
   ...
   FreeAndNil(con);
end;
...我的问题是:
1)TcpOnExecute中定义的局部变量(例如:con、strIn)是不是TLS变量,也就是是不是不需要进行同步处理?
2)当子线程调用主线程的Func方法时,我传入和传出的都是TcpOnExecute中定义的局部变量,这时是否需要对Func进行Synchronize?
3)这样在每个线程执行时都使用创建一个Connection的方法会不会造成数据库性能下降?这样做能支持多少个连接同时访问?
4)在子线程中使用该AdoConnection进行数据访问时,还需要注意什么?

解决方案 »

  1.   

    最近很少用TIdTcpServer开发过了.
      

  2.   

    1、局部变量不用同步,
    2、没明白楼主意思,总之、如果有两个线程同时读写一个变量的时候就要用到 Syn  。
    3、不要把 ADOConnection 放在 OnExecute 中,会很麻烦,ADOConnection 最好挂再外面,
    用参数传进去,最主要的是把事务处理好就行了。ADOConnection 连接一个网络数据库是很慢的。
    你放在 OnExecute 里面,会哭死地。至于支持多少个连接要看服务器的设置,与程序无关。
    4、在子线程中调用  Adoconnection 的时候要注意  事务的处理,如果是提交事务,比如有类似于
    BeginTrans CommitTrans的调用,建议楼主少用事务,因为可以导致死锁。
      

  3.   

    给楼主提醒一下,可以用  PostMessage 或 SendMessage 在线程中给主窗口发消息,
    告诉主窗口的 Connection 去做什么。当然,这样实现,不容易,要有很好的结构。