使用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进行数据访问时,还需要注意什么?
...
// 主窗口中的方法,其中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进行数据访问时,还需要注意什么?
2、没明白楼主意思,总之、如果有两个线程同时读写一个变量的时候就要用到 Syn 。
3、不要把 ADOConnection 放在 OnExecute 中,会很麻烦,ADOConnection 最好挂再外面,
用参数传进去,最主要的是把事务处理好就行了。ADOConnection 连接一个网络数据库是很慢的。
你放在 OnExecute 里面,会哭死地。至于支持多少个连接要看服务器的设置,与程序无关。
4、在子线程中调用 Adoconnection 的时候要注意 事务的处理,如果是提交事务,比如有类似于
BeginTrans CommitTrans的调用,建议楼主少用事务,因为可以导致死锁。
告诉主窗口的 Connection 去做什么。当然,这样实现,不容易,要有很好的结构。