Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 03-06-2013
joseprad joseprad is offline
Miembro
 
Registrado: oct 2006
Posts: 36
Poder: 0
joseprad Va por buen camino
Iniciar un TThread en un Form crear en runtime

Hola amigos:

Tengo un problema que no consigo resolver, ni encontró información en Internet.

Tengo un programa principal, que ha modo de menú general, abre diferentes formularios con el procedimiento:
Código Delphi [-]
with TForm1.Create(self) do begin
showModal;
free;
end;

Esto, me funciona perfectamente hasta que en un formulario abierto en tiempo de ejecución, intento crear un nuevo hilo.

El programa es una prueba de programa multi hilo, que me baje de Internet.
Código Delphi [-]
procedure TReloj.ActualizaTexto;
begin
  Form8.lbl1.Caption:=IntToStr(Hora);
end;

procedure TReloj.Execute;
begin
  Salir := False;
  Hora := 0;
  while not Salir do begin
    Synchronize(ActualizaTexto);
    sleep(1000);
    inc(Hora);
  end;
end;

Cuando lo ejecuto se ejecuta synchronize y pasa a ejecutar ActualizarTexto me da el siguiente error:
'Access violation at address 00A16CD2 in module 'MenuAplicacion'.Read of address '00000390'.

En cambio si lo ejecuto como programa principal, funciona perfectamente y no da ningún error.

Agradeceré cualquier ayuda
Responder Con Cita
  #2  
Antiguo 03-06-2013
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: 18.275
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
No parece que en ese código exista ningún problema, pero habría que ver el código completo de la llamada y del Thread.
La mayoría de los problemas con hilos llegan por intentar acceder a elementos que no están definidos en el thread (sin sincronizar).

Con esto que pones es difícil....
__________________
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 09-06-2013
joseprad joseprad is offline
Miembro
 
Registrado: oct 2006
Posts: 36
Poder: 0
joseprad Va por buen camino
Lo curioso es que si arranco directamente el programa que ejecuta el TThread, funciona correctamente.
El error lo da si genero el formulario en runTime
Responder Con Cita
  #4  
Antiguo 10-06-2013
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
joseprad,

Cita:
Empezado por joseprad:

...El programa es una prueba de programa multi hilo...

...Cuando lo ejecuto se ejecuta synchronize y pasa a ejecutar ActualizarTexto me da el siguiente error: 'Access violation at address 00A16CD2 in module 'MenuAplicacion'.Read of address '00000390'...

...si lo ejecuto como programa principal, funciona perfectamente...

...si arranco directamente el programa que ejecuta el TThread, funciona correctamente...
Pregunto:

1- ¿El formulario Form8 esta instanciado al momento de la falla?

2- ¿Puedes colocar el código es cuestión para analizar el problema?

Espero sea útil

Nelson.
Responder Con Cita
  #5  
Antiguo 16-06-2013
joseprad joseprad is offline
Miembro
 
Registrado: oct 2006
Posts: 36
Poder: 0
joseprad Va por buen camino
Hola Nelson.

Te adjunto el código completo del Form8

Código Delphi [-]
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, JfLabel, JfButtons, ExtCtrls;

type
  TForm8 = class(TForm)
    btoIniciar: TJfBitBtn;
    btoParar: TJfBitBtn;
    lbl1: TLabel;
    procedure btoIniciarClick(Sender: TObject);
    procedure btoPararClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TReloj = class(TThread)
  private
    Hora: Integer;
    Salir: Boolean;
    procedure ActualizaTexto;
  protected
    procedure Execute; override;
    procedure Terminar;
  end;

var
  Form8: TForm8;
  Reloj: TReloj;
  Corriendo: Boolean;

implementation

{$R *.dfm}
{ TReloj }

procedure TReloj.ActualizaTexto;
begin
  Form8.lbl1.Caption:=IntToStr(Hora);
end;

procedure TReloj.Execute;
begin
  Salir := False;
  Hora := 0;
  while not Salir do begin
    Synchronize(ActualizaTexto);
    sleep(1000);
    inc(Hora);
  end;
end;

procedure TReloj.Terminar;
begin
  Salir := true;
end;

procedure TForm8.btoIniciarClick(Sender: TObject);
begin
  if not Corriendo then begin
    Reloj := TReloj.Create(False);
    Corriendo := true;
  end;

end;

procedure TForm8.btoPararClick(Sender: TObject);
begin
  if Corriendo then begin
    Reloj.Terminar;
    Reloj.Free;
    Corriendo := False;
  end;
end;

procedure TForm8.FormCreate(Sender: TObject);
begin
  Corriendo := False;
end;

end.

Este programa que no es mas que un contador, funciona perfectamente.

Pero si lo arranco desde otro programa con:

Código Delphi [-]
with TForm8.Create(self) do begin
   ShowModal;
   Free;
end;

entonces me da el error.

Saludos
Responder Con Cita
  #6  
Antiguo 16-06-2013
beginner01 beginner01 is offline
Miembro
NULL
 
Registrado: mar 2011
Ubicación: República Dominicana
Posts: 181
Poder: 14
beginner01 Va por buen camino
Cita:
Empezado por joseprad Ver Mensaje
Hola Nelson.

Te adjunto el código completo del Form8

Código Delphi [-]
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, JfLabel, JfButtons, ExtCtrls;

type
  TForm8 = class(TForm)
    btoIniciar: TJfBitBtn;
    btoParar: TJfBitBtn;
    lbl1: TLabel;
    procedure btoIniciarClick(Sender: TObject);
    procedure btoPararClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TReloj = class(TThread)
  private
    Hora: Integer;
    Salir: Boolean;
    procedure ActualizaTexto;
  protected
    procedure Execute; override;
    procedure Terminar;
  end;

var
  Form8: TForm8;
  Reloj: TReloj;
  Corriendo: Boolean;

implementation

{$R *.dfm}
{ TReloj }

procedure TReloj.ActualizaTexto;
begin
  Form8.lbl1.Caption:=IntToStr(Hora);
end;

procedure TReloj.Execute;
begin
  Salir := False;
  Hora := 0;
  while not Salir do begin
    Synchronize(ActualizaTexto);
    sleep(1000);
    inc(Hora);
  end;
end;

procedure TReloj.Terminar;
begin
  Salir := true;
end;

procedure TForm8.btoIniciarClick(Sender: TObject);
begin
  if not Corriendo then begin
    Reloj := TReloj.Create(False);
    Corriendo := true;
  end;

end;

procedure TForm8.btoPararClick(Sender: TObject);
begin
  if Corriendo then begin
    Reloj.Terminar;
    Reloj.Free;
    Corriendo := False;
  end;
end;

procedure TForm8.FormCreate(Sender: TObject);
begin
  Corriendo := False;
end;

end.

Este programa que no es mas que un contador, funciona perfectamente.

Pero si lo arranco desde otro programa con:

Código Delphi [-]
with TForm8.Create(self) do begin
   ShowModal;
   Free;
end;

entonces me da el error.

Saludos

Hola.

Si te fijas en el código en rojo estas utilizando la variable Form8 que hace referencia a la clase TForm8, a la cual no le estas asignando ningún valor por lo que tiene un valor nil o nulo y si intentas hacer referencia a esta (invocar métodos o acceder a sus propiedades) Delphi te devolverá un error "Acces Violation". Una solución para tu caso es asignarle la referencia del formulario creado para que puedas acceder a él.
Código Delphi [-]
  {
  Creamos el formulario y le asignamios la referencia a la variable Form8.
  }
  Form8 := TForm8.Create(self);
  with Form8 do
  try
     ShowModal;
  finally
     Free;
  end;


try..finally
Responder Con Cita
  #7  
Antiguo 22-06-2013
joseprad joseprad is offline
Miembro
 
Registrado: oct 2006
Posts: 36
Poder: 0
joseprad Va por buen camino
Muchas gracias amigo.
Como dicen en mi tierra siempre ven mas cuatro ojos que dos.
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
crear varios form al iniciar la aplicacion FGarcia Varios 5 06-10-2008 16:11:50
Crear columnas en runtime Pedro-Juan OOP 8 09-02-2007 12:38:18
crear instalador, ejecutar al iniciar i crear desinstalador vivamotos C++ Builder 1 25-08-2006 14:13:01
Iniciar una aplicacion sin mostrar ningun form rob1 Varios 5 11-12-2005 17:14:18
Crear índice en runtime Gabriel2 Tablas planas 2 17-11-2005 22:19:00


La franja horaria es GMT +2. Ahora son las 15:35:21.


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