Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Colaboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-07-2010
Avatar de richy08
richy08 richy08 is offline
Miembro
 
Registrado: may 2007
Ubicación: Bucerias, Nayarit Mexico
Posts: 529
Poder: 20
richy08 Va por buen camino
pues valla sigo probando y creo que estaba un poco errado en lo que segun yo marcaba el error, ahora me doy cuenta de que no es posible acceder a querys fijos por medio de hilos por que sucede lo que ya les he contado sigo investigando si es posible meter sentencias sql y cadenas de conexion sobre los hilos cualquier idea es bienvenida
Responder Con Cita
  #2  
Antiguo 12-07-2010
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 19.465
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por richy08 Ver Mensaje
...ahora me doy cuenta de que no es posible acceder a querys fijos por medio de hilos por que sucede lo que ya les he contado sigo investigando si es posible meter sentencias sql y cadenas de conexion sobre los hilos cualquier idea es bienvenida
Por lo que comentas, trabajas con MSSQL; Si la conexión a realizas con ADO (que sería lo más normal) debes saber que los componentes ADO no son "Thread-safe" lo que significa que no puedes usar querys dentro de hilos compartiendo conexiones.
Si necesitas hacerlo, debes crear una nueva conexión en cada hilo (pasándola la cadena de conexión, por ejemplo).
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 12-07-2010
Avatar de richy08
richy08 richy08 is offline
Miembro
 
Registrado: may 2007
Ubicación: Bucerias, Nayarit Mexico
Posts: 529
Poder: 20
richy08 Va por buen camino
gracias neftali por la respuesta, sabes entre mas leo se me aclaran mas las ideas, realmente lo que quiero lograr es que la parte que se ejecuta como servidor (un .exe que corre en el server) sea el que ejecute los querys pero ahi una pieza clave que no logro decifrar aun , creare una funcion que me cree en tiempo de ejecucion las conexiones , y los querys que ejecuto tomando en cuenta el nombre de la maquina para evitar componentes con el mismo nombre pero al ejecutarlos me sigue quedando la duda si esto funcionara crees que sea un camino viable mil gracias.
Responder Con Cita
  #4  
Antiguo 12-07-2010
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 19.465
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por richy08 Ver Mensaje
...creare una funcion que me cree en tiempo de ejecucion las conexiones , y los querys que ejecuto tomando en cuenta el nombre de la maquina para evitar componentes con el mismo nombre pero al ejecutarlos me sigue quedando la duda si esto funcionara crees que sea un camino viable mil gracias.
No veo ningun poblema en que un ejecutable cree conexiones, querys y lance consultas. No deberías tener problemas con eso si lo haces correctamente. No me acaba de quedar claro la comunicación de ese ejecutable con otras aplicaciones o lo que hay alrededor de él, pero la parte técnica que comentas no parece que deba fallar.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #5  
Antiguo 12-07-2010
Avatar de richy08
richy08 richy08 is offline
Miembro
 
Registrado: may 2007
Ubicación: Bucerias, Nayarit Mexico
Posts: 529
Poder: 20
richy08 Va por buen camino
a ok gracias neftali intentare programarlo aunque tengo algunas preguntas que no me dejan avanzar, la necesidad de que este ejecutable lanze los querys es por que la red donde corren la aplicacion esta dividida en 3 vlans, 1 es para huespedes, 2 es la administrativa y la 3 es de uso exclusivo para un conmutador ip, la administrativa es donde corre normalmente la aplicacion pero las maquinas no pueden ver la 3 red, pero necesito recuperar y escribir informacion en la bd de mysql del conmutador, y la unica maquina con dos tarjetas de red capaz de ver la red 2 y 3 es el server es por eso que esta aplicacion necesita hacer los procesos con los componentes zeos y modificar la bd del conmutador y escribir informacion en la bd de mssql, despues de que terminen dichos procesos la aplicacion solo recoje los datos y los muestra.

1.-necesito por cada hilo que se cree, crear un tzconnection que les hereda la conexion a cada uno de los tzquery.

2.-despues de que se crean y tienen su sql cada tzquery, en que momento los ejecuto para que no se traslapen con otros(la integridad la manejare por medio de parametros un query nunca ira sobre la misma row)
Responder Con Cita
  #6  
Antiguo 16-07-2010
manuc manuc is offline
Miembro
 
Registrado: abr 2010
Posts: 165
Poder: 17
manuc Va por buen camino
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.
Responder Con Cita
  #7  
Antiguo 16-07-2010
Avatar de richy08
richy08 richy08 is offline
Miembro
 
Registrado: may 2007
Ubicación: Bucerias, Nayarit Mexico
Posts: 529
Poder: 20
richy08 Va por buen camino
Cita:
Empezado por manuc Ver Mensaje
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;

    //datos de la reserva
    Qry_Busaco.close;
    Qry_Busaco.Parameters.ParamByName('nconf').Value:=Qry_principal.fieldbyname('nconf').Value;
    Qry_Busaco.Open;

    //trae le nombre
    Qry_Nombre.close;
    Qry_Nombre.Parameters.ParamByName('aowner').Value:=Qry_principal.fieldbyname('aowner').Value;
    Qry_Nombre.Open;

    CommBlock.Command      := '';//EditCommand.Text;         // assign the data
    CommBlock.MyUserName   := 'DESARROLLO';//Client.LocalName;
    CommBlock.Msg          := '';//EditMessage.Text;
    CommBlock.ReceiverName := '';//EditRecipient.Text;
    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
       //coneccion mysql
       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;

       //coneccion mssql
       connect:= tadoconnection.Create(nil);
       With Connect do
       begin
        connectionstring:=cadena;
        loginprompt:=false;
        provider:='SQLOLEDB.1';
        name:=Myusername+'m';
        connected;
       end;

       //crea el query   mssql   busca extensiones
       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;

       //crea el query   mysql
       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;  // update the time of last action

    CreaAdo(CommBlock.MyUserName, CommBlock.nombre, CommBlock.acode, CommBlock.estado);

    Protocol.Lines.Add (TimeToStr(Time)+'The process for '+CommBlock.MyUserName+' was started');
    NewCommBlock.Command := 'DIALOG';       // the message should popup on the client's screen
    NewCommBlock.MyUserName := '[PBX Server]';  // the server's username
    NewCommBlock.Msg := 'The process was done  ';  // the message to show
    NewCommBlock.ReceiverName := '[return-to-sender]'; // unnecessary
                                                                                                                                           
    AThread.Connection.WriteBuffer (NewCommBlock, SizeOf (NewCommBlock), true);  // and there it goes...
  end;
end;
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Como instalar los componenetes de la Norma 19 diego11 Varios 3 17-10-2007 12:08:44
componenetes en un TTabControl lucasarts_18 OOP 2 27-09-2005 23:44:43
instalar nuevos componenetes aranel OOP 6 02-08-2005 09:25:33
Multiple Hilos con Indy en Delphi 6 cancerbero Varios 4 12-06-2004 19:01:21
Componenetes para envio y recepcion de mensajes en la red enrique800 OOP 3 29-01-2004 04:31:41


La franja horaria es GMT +2. Ahora son las 19:42:30.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi