Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-01-2009
Dark_RavenM Dark_RavenM is offline
Miembro
 
Registrado: dic 2007
Posts: 25
Poder: 0
Dark_RavenM Va por buen camino
ok ise este ejemplo de la sincronizacion

Código Delphi [-]
type
  TBarra = class(TThread)
  private
  protected
    procedure detenlabarra;
    procedure Execute; override;
  public
  end;

  TForm1 = class(TForm)
    Button1: TButton;
    RichEdit1: TRichEdit;
    ProgressBar1: TProgressBar;
    OracleSession1: TOracleSession;
    OracleLogon1: TOracleLogon;
    OracleScript1: TOracleScript;
    OracleQuery1: TOracleQuery;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

var
cont:integer;

{$R *.dfm}

procedure TBarra.detenlabarra;
begin
   sleep(2000);
   cont:=1;
end;

procedure TBarra.Execute;
begin
   Synchronize(detenlabarra);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
   hilo:TBarra;
begin
   hilo:=TBarra.Create(False);
   while cont<>1 do
   begin
      ProgressBar1.StepIt;
      sleep(125);
   end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   cont:=0;
end;

pero nunca se detiene, en cambio si le hago asi si

Código Delphi [-]
type
  TBarra = class(TThread)
  private
  protected
    procedure Execute; override;
  public
  end;

  TForm1 = class(TForm)
    Button1: TButton;
    RichEdit1: TRichEdit;
    ProgressBar1: TProgressBar;
    OracleSession1: TOracleSession;
    OracleLogon1: TOracleLogon;
    OracleScript1: TOracleScript;
    OracleQuery1: TOracleQuery;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

var
cont:integer;

{$R *.dfm}

procedure TBarra.Execute;
begin
   sleep(2000);
   cont:=1;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
   hilo:TBarra;
begin
   hilo:=TBarra.Create(False);
   while cont<>1 do
   begin
      ProgressBar1.StepIt;
      sleep(125);
   end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   cont:=0;
end;

que podra estar mal?

Última edición por Dark_RavenM fecha: 23-01-2009 a las 17:51:44.
Responder Con Cita
  #2  
Antiguo 23-01-2009
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 21
Chris Va por buen camino
Lo que pasa es que el el primer código, por estar dentro de un synchronize, todo el código de existe en "adentlabarra" se ejecuta a como si estobien en el hilo principal. Por esta razón, cuando llegas a la línea "while ... do" la variable count ya está en 1.

Ahora, cual es la direfencia respecto al segundo código: bien, luego de crear el nuevo hilo, la aplicación sigue su ejecución normal, como si nada la detuviese, pero por el contrario el hilo queda dormido por dos segundos ("sleep(2000)"). Luego de esto, cuando el hilo llega a asignar un valor a la variable cont, la aplicación principal ejecutó "while ... do" hace dos segudos.

No me he explicado bien, es un problema sencillo, pero lo he encontrado difícil de explicar. Sin embargo, comparando ambos código, creo que puedo determinar cual es tu intención:
Código Delphi [-]
var
   hilo:TBarra;
begin
   cont := 0;
   hilo:=TBarra.Create(False);
   while cont<>1 do
   begin
      ProgressBar1.StepIt;
      form1.update;
      sleep(125);
   end;
end;
Utilizando el segundo código, con una ligerisimo modificación, lo que hace el anterior código es hacer mover el progressbar de la aplicación durante 2 segundos.

Saludos.
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #3  
Antiguo 23-01-2009
Dark_RavenM Dark_RavenM is offline
Miembro
 
Registrado: dic 2007
Posts: 25
Poder: 0
Dark_RavenM Va por buen camino
ok, ya le cambie, ahora para ejecutar el query como podria hacerle?, por que por ejemplo ise este codigo

Código Delphi [-]
type
  TBarra = class(TThread)
  private
     sesion:TOracleSession;
     script:TOracleScript;
  protected
     procedure Execute; override;
  public
  end;

  TForm1 = class(TForm)
    Button1: TButton;
    RichEdit1: TRichEdit;
    ProgressBar1: TProgressBar;
    OracleSession1: TOracleSession;
    OracleLogon1: TOracleLogon;
    Script1: TOracleScript;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

var
cont:integer; resultado:TStrings;

{$R *.dfm}

procedure TBarra.Execute;
begin
   try
      sesion.LogonUsername:='lg';
      sesion.LogonPassword:='lg';
      sesion.LogonDatabase:='bd.world';
      sesion.Connected:=true;
      script.Session:=sesion;
      script.Lines.Add('select * from usuarios');
      script.Execute;
      resultado:=script.Output;
      sleep(2000);
      cont:=1;
   except
      on E : Exception do
      begin
         sleep(2000);
         cont:=1;
      end;
   end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
   hilo:TBarra;
begin
   hilo:=TBarra.Create(False);
   cont:=0;
   while cont<>1 do
   begin
      ProgressBar1.StepIt;
      form1.update;
      sleep(125);
   end;
   if not(resultado=nil) then
      RichEdit1.Lines:=resultado
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   cont:=0;
end;

pero nisiquiera ejecuta el query se va directo al exception estoy haciendoalgo mal?
Responder Con Cita
  #4  
Antiguo 23-01-2009
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 21
Chris Va por buen camino
No debes estar haciendo nada mal, por el contrario. Lo que debe susceder es que los componentes que estás utilizando para hacer la conexión a la DB no son "Thread Save", es por esta razón que generan una ecepción, que supongo debe ser de tipo AV. Desde este punto, lo único que puedes intentar hacer es desconectar de cualquier componente TDatasource al que esté conectado el componente de conexión.

Por otro lado, también puedes intentar co un try ... except, auque creo que con la mayoría de componentes de conexión esto no es recomendable hacerlo.

Saludos.
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #5  
Antiguo 23-01-2009
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 21
Chris Va por buen camino
Código Delphi [-]
..
 script.Session:=sesion;
 script.Lines.Add('select * from usuarios');
 script.Execute;
 resultado:=script.Output;
..
No si "script" es una variable, o es un objeto que esta ubicado en algún formulario. Si es el último caso, las anteriores líneas deben estar dentro de un procedimiento del Thread que sea llamado con synchronize:
Código Delphi [-]
TBarra.ActualizarScript;
begin
with formulario1.script do
  Session := sesion;
  lines.Add('select * from usuarios');
  script.Execute;  // esta línea podría moverse a otro método del thread (threaded), si es que no producen problemas al hacerlo.
  respaldo := script.Output;  // no quiero producir un bug al omitir "script"
end;

Lo puedes llamar así:
Código Delphi [-]
procedure TBarra.Execute;
begin
   try
      sesion.LogonUsername:='lg';
      sesion.LogonPassword:='lg';
      sesion.LogonDatabase:='bd.world';
      sesion.Connected:=true;
//      script.Session:=sesion;
//      script.Lines.Add('select * from usuarios');
//      script.Execute;
//      resultado:=script.Output;

//    Las líneas comentadas arriba fueron puestas en "ActualizarScript"
      Synchronize(ActualizarScript);

      sleep(2000);
      cont:=1;
   except
      on E : Exception do
      begin
         sleep(2000);
         cont:=1;
      end;
   end;
end;

Saludos.-
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #6  
Antiguo 23-01-2009
Dark_RavenM Dark_RavenM is offline
Miembro
 
Registrado: dic 2007
Posts: 25
Poder: 0
Dark_RavenM Va por buen camino
un objeto que cree dentro del hilo
type
TBarra = class(TThread)
private
sesion:TOracleSession;
script:TOracleScript;
protected
procedure Execute; override;
public
end;
Responder Con Cita
  #7  
Antiguo 23-01-2009
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 21
Chris Va por buen camino
Ahí si que ya me la pusistes fea.
Que tipo de excepción te estaba dando? y en que línea te decía. Además, por supuesto del mensaje de error.
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #8  
Antiguo 23-01-2009
Dark_RavenM Dark_RavenM is offline
Miembro
 
Registrado: dic 2007
Posts: 25
Poder: 0
Dark_RavenM Va por buen camino
Cita:
Empezado por D&W Ver Mensaje
No debes estar haciendo nada mal, por el contrario. Lo que debe susceder es que los componentes que estás utilizando para hacer la conexión a la DB no son "Thread Save", es por esta razón que generan una ecepción, que supongo debe ser de tipo AV. Desde este punto, lo único que puedes intentar hacer es desconectar de cualquier componente TDatasource al que esté conectado el componente de conexión.

Por otro lado, también puedes intentar co un try ... except, auque creo que con la mayoría de componentes de conexión esto no es recomendable hacerlo.

Saludos.
ya lo probe asi como me dijiste separando el codigo con una sincronisacion pero no tampoco cumple el cometido sigue entrando directo al exeption, supongo que puede ser por lo que dices que el componente no es thread save, pero cual otro componente podria utilizar para ejecutar scripts completos en un programa de delphi ya que el tquery solo es para un query simple y yo necesito ejecutar procedimientos y cosas asi que me regresen todo el resultado de la ejecucion
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
Ayuda con Hilos de ejecucion kurono Varios 19 15-01-2011 15:36:40
Hilos johurgi Varios 2 16-07-2007 10:57:08
Ayuda Con Hilos(Threds) juangiron OOP 1 04-05-2007 19:46:24
ver hilos Cosgaya Varios 1 07-06-2005 20:35:16


La franja horaria es GMT +2. Ahora son las 16:17:00.


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