Cita:
Empezado por manuc
Hola richy08,
En algún proyecto he realizado lo mismo que quieres hacer, es decir, un servidor multihilo que genera una batería de conexiones (una por hilo) de tan forma que cada hilo pueda ejecutar una serie de sentencias sql directa y simultaneamente.
Puede funcionar perfectamente.
Al leer lo que comentas, me surge una duda.
Entiendo que lo que estás programando es un servidor TCP y que al recibir una conexión entrante (de un cliente) se atiende por un hilo en el servidor.
¿Por qué quieres generar una conexión por hilo en TCPServer?
¿para ganar mayor velocidad en la ejecución de sentencias?
¿agilizar la concurrencia en el servidor?
Te lo comento porque también puedes crear un procedimiento en el TCPServer que se encargue de la conexión y de las sentencias SQL y llamarlo con el método synchronize del hilo.
Básicamente esto lo que hace es acceder de modo controlado a la VCL y así evitas los problemas de acceso a componentes, por parte de lo hilos.
Un saludo.
|
hola manuc gracias por tu respuesta, bueno la idea de crear una conexion
por hilo es por que lo que he estando leyendo y comentarios de los compañeros que los querys no son hilo seguro es por esa la razon, creo que es esa la forma en que lo hice pero valla lo he estado testeando y al parecer funciona pero he tenido erorres de memoria en mi maqina por lo cual no estoy tan seguro de que tambien programado este

, estos son los fragmnetos de codigo donde ejecuto las peticiones, te agradeceria si me pudieras orientar y en le caso de que vieras errores de logica me lo hicieras saber mil gracias por tu tiempo
//cliente
Código Delphi
[-]
procedure TClientHandleThread.Execute;
begin
while not Terminated do
begin
if not Frm_Posgue.Client.Connected then
Terminate
else
try
Frm_Posgue.Client.ReadBuffer(CB, SizeOf (CB));
Synchronize(HandleInput);
except
end;
end;
end;
CBClientActive.Checked:=true;
Qry_Busaco.close;
Qry_Busaco.Parameters.ParamByName('nconf').Value:=Qry_principal.fieldbyname('nconf').Value;
Qry_Busaco.Open;
Qry_Nombre.close;
Qry_Nombre.Parameters.ParamByName('aowner').Value:=Qry_principal.fieldbyname('aowner').Value;
Qry_Nombre.Open;
CommBlock.Command := ''; CommBlock.MyUserName := 'DESARROLLO'; CommBlock.Msg := ''; CommBlock.ReceiverName := ''; CommBlock.nconf := Qry_principal.fieldbyname('nconf').Value;
CommBlock.acode := Qry_Busaco.fieldbyname('acode').value;
CommBlock.nombre := Qry_Nombre.fieldbyname('guest').Value;
CommBlock.estado :=1;
Client.WriteBuffer (CommBlock, SizeOf (CommBlock), true);
//server
Código Delphi
[-]
function TFrm_Interfaces.CreaAdo(Myusername, nombre: string; acode, estado : integer):boolean;
var
i, seleccion :integer;
begin
zConnect1:= TzConnection.Create(nil);
With zConnect1 do
begin
Parent:= Frm_Interfaces;
Name:= Myusername+'z';
Catalog:= 'lookup';
Database:= 'cdr';
HostName:= '192.168.10.3';
Password:= 'siti270';
Protocol:= 'mysql-5';
port:= 3306;
User:= 'root';
Connect;
end;
connect:= tadoconnection.Create(nil);
With Connect do
begin
connectionstring:=cadena;
loginprompt:=false;
provider:='SQLOLEDB.1';
name:=Myusername+'m';
connected;
end;
Query := TAdoquery.Create(nil);
with Query do
begin
Name := Myusername+'1';
close;
Connection:= connect;
SQL.text:='select idext, DesTel from pbx_ext where acode=:acode ';
parameters.ParamByName('acode').Value:=acode;
Parent:= Frm_Interfaces;
CursorType := ctStatic;
open;
end;
zQuery := TzQuery.Create(nil);
with zQuery do
begin
Name := Myusername+'2';
Connection:= zConnect1;
SQL.text:='update lookup set allowcalls=:allowcalls, ldesc=:ldesc where code=:code ';
Parent:= Frm_Interfaces;
end;
i:=0;
seleccion:=Query.RecordCount;
Query.First;
While ido
begin
zQuery.Close;
zQuery.ParamByName('allowcalls').Value:=estado;
zQuery.ParamByName('ldesc').Value:=nombre;
zQuery.ParamByName('code').Value:=Query.fieldbyname('idext').Value;
zQuery.ExecSQL;
i:=i+1;
Query.Next;
end;
end;
procedure TFrm_Interfaces.ServerExecute(AThread: TIdPeerThread);
var
ActClient, RecClient: PClient;
CommBlock, NewCommBlock: TCommBlock;
RecThread: TIdPeerThread;
i: Integer;
begin
if not AThread.Terminated and AThread.Connection.Connected then
begin
AThread.Connection.ReadBuffer (CommBlock, SizeOf (CommBlock));
ActClient := PClient(AThread.Data);
ActClient.LastAction := Now;
CreaAdo(CommBlock.MyUserName, CommBlock.nombre, CommBlock.acode, CommBlock.estado);
Protocol.Lines.Add (TimeToStr(Time)+'The process for '+CommBlock.MyUserName+' was started');
NewCommBlock.Command := 'DIALOG'; NewCommBlock.MyUserName := '[PBX Server]'; NewCommBlock.Msg := 'The process was done '; NewCommBlock.ReceiverName := '[return-to-sender]';
AThread.Connection.WriteBuffer (NewCommBlock, SizeOf (NewCommBlock), true); end;
end;