Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

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
ejecutando hilos en componenetes indy tcp

buenos dias compañeros por requerimientos del cliente y limitantes de la red me vi forzado en partir una aplicacion en dos, la duda que tengo y por mas que leo no logro convencerme o saber con certeza que es lo que sucedera, les platico tengo una aplicacion conde delphi 7 y mssql 2005 la cual tambien conecta con otras bd de access y mysql, para los procesos que involucran coneccion en access y mysql esa es la parte que la envie a un nuevo .exe la idea es que las aplicaiones clientes manden llamar a este nuevo .exe para que genere esos procesos la duda radica aqui que pasara cuando una estacion mande llamar un proceso donde ejecuta querys y otra estacion haga lo mismo cuando la primera estacion no ha terminado el proceso.

pregunta: el componente sabe que debe de experar a que termine de ejecutar los procesos de la primera peticion para cotinuar con la peticion de la segunda maquina gracias por cualquier respuesta.
Responder Con Cita
  #2  
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
sigo con las pruebas y si al parecer me hace falta algo, ya que al ejecutar los querys y simular un enpalme de peticiones de dos maquinas diferentes me marca un error y la aplicaion server se queda pasmada, el error que me marca es que no se pueden completar las operaciones de forma asincrona, algun manual donde pueda ver como sincronizar las operaciones gracias
Responder Con Cita
  #3  
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
  #4  
Antiguo 12-07-2010
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is online now
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 19.442
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
  #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
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
  #6  
Antiguo 12-07-2010
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is online now
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 19.442
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
  #7  
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
  #8  
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
  #9  
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
  #10  
Antiguo 17-07-2010
manuc manuc is offline
Miembro
 
Registrado: abr 2010
Posts: 165
Poder: 17
manuc Va por buen camino
Hola richy08,

A simple vista, creo, que los errores de memoria te vienen dado porque no estás destruyendo los querys que creas.

Prueba a destruirlos cuando ya no los necesites.

Un saludo.
Responder Con Cita
  #11  
Antiguo 17-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 manuc la razon por lo que no los destruyo es por que no se con certeza si el hilo espera a que termine una peticion para empezar a ejecutar la otra, o si crea diferentes instancias de la funcion donde los crea me podrias iluminar saludos.
Responder Con Cita
  #12  
Antiguo 19-07-2010
manuc manuc is offline
Miembro
 
Registrado: abr 2010
Posts: 165
Poder: 17
manuc Va por buen camino
Hola richy08,

Dentro de cada hilo, la ejecución es lineal. Es decir, cuando se conecta el tcpClient, el tcpServer Crear un hilo que atenderá la actividad de esa conexión y la ejecución del código programado para ese hilo se hará de forma lineal.
Si, mientras un hilo ejecuta su código, entra otra conexión, se generará un hilo paralelo y se ejecutaran ambos al mismo tiempo.

Gracias a esto, el TCPServer es multihilo y cada conexión se ejecuta de forma independiente, salvo en los puntos donde se utilice "synchronize".

Sabiendo esto, puedes hacer dos cosas:

1.- Crear tus componentes en el evento onConnect del tcpServer. Es decir, por cada hilo que se crea en el tcpServer, creas los componentes correspondientes.
Para este caso, deberías destruir los componentes cuando no los necesites, es decir, cuando se destruye el hilo. Esto ocurre en el evento onDisconnect del tcpServer.

2.- Crear tus componentes en el evento onExecute del tcpServer. Es decir, cada vez que un hilo tiene actividad, creas los componentes que necesites.
Igualmente, cuando ya no necesites estos componentes, los debes destruir. Esto es justo al final del evento onExecute del tcpServer.

En ambos casos, debes relacionar de alguna forma cada componente que creas con el hilo correspondiente, de tal forma que cuando un hilo finaliza su ejecución sepas qué componentes has de destruir.

Otra cosa que te recomiendo, es que incluyas un try-except en tu evento onExecute, englobando todo el código, para que puedas controlar mejor la destrucción de los componentes que creas y no se te quede ninguno cargado en memoria.

Espero haberte ayudado de alguna forma.

Si tienes más dudas, pregunta sin problemas.

un saludo.
Responder Con Cita
  #13  
Antiguo 19-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 ambos casos, debes relacionar de alguna forma cada componente que creas con el hilo correspondiente, de tal forma que cuando un hilo finaliza su ejecución sepas qué componentes has de destruir.

un saludo.
gracias manuc ahora tengo mas claro el comportamiento de los hilos, solo me queda una ultima duda en el codigo arriba les voy dando un nombre a cada componenete, que se compone del nombre de la maquina+'caracter', pero al intentar accederlo por su nombre no logro hacerlo alguna otra idea de como podria distinguir que componnete se creo en cada hilo, o como poderlo acceder por el nombre que le he asignado.

saludos
Responder Con Cita
  #14  
Antiguo 19-07-2010
manuc manuc is offline
Miembro
 
Registrado: abr 2010
Posts: 165
Poder: 17
manuc Va por buen camino
Hola Richy08,

Pues sí, alguna te puedo dar.

Este código puede ser un poco más complicado de seguir al principio, pero creo que el más cómo, una vez lo tengas claro.

1.- Te Creas una nueva clase, para manejar tus componentes:

Código Delphi [-]
type
  tmisComponentes=Class(tPersistent)
  private
   fConexion:TSQLConnection;
   fQuery:TDataSet;
  Public
   destructor Destroy;
   property Conexion:TSQLConnection read fConexion write fConexion;
   property Query:TDataSet read fQuery write fQuery;
  end;

Cambia el tipo de componetes que quieras crear.

2.- Al recibir la conexión en el tcpServer Creamos los componentes:

Código Delphi [-]
procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
var
 MisComponentes:tmisComponentes;
begin
 MisComponentes := tmisComponentes.Create;
 MisComponentes.Conexion := TSQLConnection.Create(self);
 MisComponentes.Query := TDataSet.Create(Self);

 AThread.Data := @MisComponentes;

end;

3.- ¿Cómo usarlos?

Código Delphi [-]
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
 MisComponentes:tmisComponentes;
begin
 MisComponentes :=  tmisComponentes(AThread.Data);

 MisComponentes.Query ....

end;

4.- Como destruirlos:

Código Delphi [-]
procedure TForm1.IdTCPServer1Disconnect(AThread: TIdPeerThread);
var
 MisComponentes:tmisComponentes;
begin
 MisComponentes :=  tmisComponentes(AThread.Data);

 MisComponentes.Conexion.Free;
 MisComponentes.Query.Free;

 ...

end;

Básicamente, lo que se haces es "recordar" la dirección de memoria donde están localizados los componentes, utilizando para ello un "puntero" que tiene cada conexión (.data).

Lo he hecho de cabeza y sin compilarlo. Puede ser que me haya equivocado en algo, pero básicamente lo puedes hacer así.

Si encuentra alguna duda, consulta sin problemas.

Un saludo.
Responder Con Cita
  #15  
Antiguo 20-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 manuc tratare de implementarlo asi y comento.
Responder Con Cita
  #16  
Antiguo 27-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
hola manuc perdon por responder hasta ahora peor me habian asignado otras tareas sabes he estado haciendo pruebas sobre la red, y los sockets abren y cierran perfectamente pero al devolver por el hilo el mensaje de que el procedimiento se llevo acabo bien nunca ejecuta ningun query ni devuelve le mensaje, es justo en este pedazo de codigo, me podrias orientar si es que me hace falta algo, este codigo lo tome del ejemplo de IdTCPDemo, gracias

Código Delphi [-]
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 done ');// # Confirm'+inttostr(CommBlock.nconf));
    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
  #17  
Antiguo 27-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
sabes creo que mas bien el problema radica en este pedazo de codigo que corre en el 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;

ya que al llegar a esta linea Frm_Posgue.Client.ReadBuffer(CB, SizeOf (CB)); por alguna razon no manda llamar el Synchronize alguna pista de que pueda ser gracias por cualquier comentario
Responder Con Cita
  #18  
Antiguo 27-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
bueno por fin encontre mi problema jeje al parecer la forma en que creo los componentes no es la adecuada seguire investigando
Responder Con Cita
  #19  
Antiguo 28-07-2010
manuc manuc is offline
Miembro
 
Registrado: abr 2010
Posts: 165
Poder: 17
manuc Va por buen camino
Hola Richy08,

La verdad es que no lo entendí muy bien, pero me alegro que hayas encontrado la solución.

Un saludo.
Responder Con Cita
  #20  
Antiguo 28-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
Buenas tardes manuc he estado reajustando el codigo con los ejemplos que me has dado pero me saltan algunos errores que no he conseguido resolverlos

1. el primero es al crear la clase en la linea de destructor Destroy;
Código Delphi [-]
tmisComponentes=Class(tPersistent)
  private
   fConexionADO:TADOConnection;
   fQueryADO:TAdoQuery;
   fConexionZ:TZConnection;
   fQueryZ:TZQuery;
  Public  
   destructor Destroy; 
   property Conexion:TADOConnection read fConexionADO write fConexionADO;
   property Query:TAdoQuery read fQueryADO write fQueryADO;
   property Conexion1:TZConnection read fConexionZ write fConexionZ;
   property Query1:TZQuery read fQueryZ write fQueryZ;
  end;
[Error] Interfaces.pas(47): Unsatisfied forward or external declaration: 'tmisComponentes.Destroy', al comentarla el programa corre pero no se s iesto me desencadena algunos otros errores


2.-al querer asignarle al componente "conexion" la cadena de conexion que fue creada en el evento formcreate

Código Delphi [-]
procedure TFrm_Interfaces.FormCreate(Sender: TObject);
begin
  Clients := TThreadList.Create;
   cadena:='Provider=SQLOLEDB.1;Password=Siti2009;Persist Security Info=True;User ID=sa;Initial Catalog=PMS;Data Source=SITISERVER08\SITISQL_05; ';
  cadena:=cadena+' Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=DESARROLLO;Use Encryption for Data=False;Tag with column collation when possible=False';
  CBServerActive.Checked:=true;
end;


al querer asignarle la cadena en el evento serverexecute MisComponentes.Conexion.ConnectionString:=cadena;


Código Delphi [-]
procedure TFrm_Interfaces.ServerExecute(AThread: TIdPeerThread);
var
  ActClient, RecClient: PClient;                                                                              
  CommBlock, NewCommBlock: TCommBlock;
  RecThread: TIdPeerThread;
  i, seleccion: Integer;
  MisComponentes:tmisComponentes;
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
    MisComponentes :=  tmisComponentes(AThread.Data);
    //conneccionMSSQL
    MisComponentes.Conexion.ConnectionString:=cadena;
    MisComponentes.Conexion.loginprompt:=false;
    MisComponentes.Conexion.provider:='SQLOLEDB.1';
    MisComponentes.Conexion.connected;
    //conneccionMSSQL
    //conneccionMysql
    MisComponentes.Conexion1.Catalog:= 'lookup';
    MisComponentes.Conexion1.Database:= 'cdr';
    MisComponentes.Conexion1.HostName:= '192.168.10.3';
    MisComponentes.Conexion1.Password:= 'siti270';
    MisComponentes.Conexion1.Protocol:= 'mysql-5';
    MisComponentes.Conexion1.port:= 3306;
    MisComponentes.Conexion1.User:= 'root';
    MisComponentes.Conexion1.connect; 
    //conneccionMysql
    //queryMssql
    MisComponentes.Query.Close;
    MisComponentes.Query.Connection:= MisComponentes.Conexion;
    MisComponentes.Query.SQL.Text:='select idext, DesTel from pbx_ext where acode=:acode';
    MisComponentes.Query.parameters.ParamByName('acode').Value:=CommBlock.acode;
    MisComponentes.Query.cursorType := ctStatic;
    MisComponentes.Query.open;
    //queryMssql
    //queryMysql
     MisComponentes.Query1.Connection:=MisComponentes.Conexion1;
     MisComponentes.Query1.SQL.Text:='update lookup set  allowcalls=:allowcalls, ldesc=:ldesc where code=:code ';
    //queryMysql

    //ejecuta abrir y cerrar lineas
     i:=0;
     seleccion:=Query.RecordCount;
     MisComponentes.Query.First;
     While ido
     begin
        MisComponentes.Query1.Close;
        MisComponentes.Query1.ParamByName('allowcalls').Value:=CommBlock.estado;
        MisComponentes.Query1.ParamByName('ldesc').Value:=CommBlock.nombre;
        MisComponentes.Query1.ParamByName('code').Value:=MisComponentes.Query1.fieldbyname('idext').Value;
        MisComponentes.Query1.ExecSQL;
        i:=i+1;
        MisComponentes.Query.Next;
     end;
    //ejecuta abrir y cerrar lineas
    Protocol.Lines.Add (TimeToStr(Time)+' The process for '+CommBlock.MyUserName+' was done ');// # Confirm'+inttostr(CommBlock.nconf));
    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;

el error que envia es Project interfacesP.exe raised exception class EAccessViolation with message 'Access violation at address 00000000. Read of address 00000000'. Process stopped. Use Step or Run to continue.

alguna idea de que pueda ser mil gracias
Responder Con Cita
Respuesta



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 21:17:52.


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