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 09-07-2012
aoshishin1 aoshishin1 is offline
Registrado
NULL
 
Registrado: jul 2012
Posts: 9
Poder: 0
aoshishin1 Va por buen camino
Problema: Hilo No ejecuta Procedimiento de su formulario.

Buenos dias, es la primera ves que posteo aqui ya que hace poco eh empezado a usar delphi y la verdad esta comunicadad me ha salvado mucho al vida.

Bueno, resulta que me he topado con el siguiente problema.

Tengo un proyecto en delphi el cual tengo un formulario de tipo MDIForm, el cual abro una ventana llamada FrmAuxialiar de tipo medichild (hija del otro formulario).

Dentro de esta ventana hija tengo creado un hilo, lo que quiero hacer es ejecutar dentro de este hilo un procedimiento declarado dentro de mi FrmAuxiliar, el problema es que cuando hago el excute, no me toma ese procedimiento, no lo reconoce, es como si el hilo no supiera donde se encuentra declarado o parado por asi decirlo.

Me gustaria saber uan forma de poder llamar a estos procedimientos dentro de mi hilo, para asi poder hacer esta multitarea,les muestro el codigo.

Código Delphi [-]
unit UTFrmAuxialiar;

interface

uses


  type
  THilo = class(TThread)
    Lista: TListBox;
    procedure Execute; override;
    procedure MostrarContador;
    procedure Terminar;
  end;

  private
    Hilo : Thilo;



//------------------------------------------------------------------------------
procedure THilo.Execute;
var
  i : integer;
begin
  inherited;
  FreeOnTerminate := True;
  while not terminated do
  begin
   FrmAuxialiar.MostrarCargando;
  end;
end;

procedure THilo.MostrarContador;
begin
  FrmAuxialiar.MostrarCargando;
end;

procedure THilo.Terminar;
begin
  FrmAuxialiar.OcultarCargando;
  Terminate;
end;
//---------------------------------------------------------
procedure TFrmAuxialiar.MostrarCargando;
begin
   Panel20.Visible:=true;
   AdvCircularProgress1.Enabled := true;
end;

procedure TFrmAuxialiar.Nuevo1Click(Sender: TObject);
begin
 hilo:=Thilo.Create(False);
 hilo.Resume;
end;
Como veran, cuando hagvo el execute, me deberia de mostrar un panel y un circularbar, pero no lo hace.
Desde ya muchas gracias y espero que me brinde una pequeña ayuda.
Saludos!!

Última edición por Casimiro Notevi fecha: 09-07-2012 a las 19:17:43. Razón: Cambiar [cita] por [delphi]
Responder Con Cita
  #2  
Antiguo 09-07-2012
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Estudia el metodo Synchronize en la ayuda de delphi.

Saludos.
Responder Con Cita
  #3  
Antiguo 09-07-2012
aoshishin1 aoshishin1 is offline
Registrado
NULL
 
Registrado: jul 2012
Posts: 9
Poder: 0
aoshishin1 Va por buen camino
Muchas gracias por tu respuesta, ya supe cual fue el error, ahorra miduda es al siguiente, me gustaria saber que tanta versatibilidad tiene un hilo para correr en segundo plano un procedimiento que no es propio de el, pro ejemplo.

Código Delphi [-]

procedure THilo.Execute; 
var   i : integer; 
begin   
inherited;   
FreeOnTerminate := True;   
while not terminated do   
begin   
Synchronize(MostrarContador);   
end; 
end;

 procedure THilo.MostrarContador; 
begin   
FrmAuxialiar.MostrarCargando; 
end;

procedure TFrmAuxialiar.MostrarCargando;
var
  i:integer;
begin
 i:=1;
 While i>0 do
  begin
 i:=i+1; 
 end;
end;

Estoy forzando a un bucle infinito, y quiero ver si se respeta la concurrencia, pero al hacer esto se me traba la pantalla.
Me gustaria saber el por que, y si hay alguna manera que el procedimiento "Mostrarcargando" se pueda correr paralelamente sin definirlo dentro del hilo.

Muchas gracias!!!!!

Última edición por Casimiro Notevi fecha: 10-07-2012 a las 10:01:13. Razón: Cambiar [quote] por [delphi] !!!
Responder Con Cita
  #4  
Antiguo 10-07-2012
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
No olvides poner las etiquetas de código para que éste sea legible.

Lo que bloquea tu APP es FrmAuxialiar pues éste bloquea los mensajes de la App.

Mira esto:

Código Delphi [-]
procedure THilo.Execute;
begin
  FreeOnTerminate := True;
  while not terminated do
    Synchronize(FrmAuxialiar.MostrarCargando);
end;

procedure TFrmAuxialiar.MostrarCargando;
var
  i:integer;
begin
  i:=1;
  Show;
  While i>0 do
  begin
    Application.ProcessMessages;
    i:=i+1;
  end;
end;

Este ejemplo es un tanto absurdo pues el bucle del thread llama repetidamente a un método de un formulario que presenta un bucle infinito con lo que el bucle del Thread se ejecuta sólo una vez...

El método Execute del thread no tiene porqué tener un bucle, en ese caso termina cuando termine Exectue. Tu decides lo que tiene que hacer.


Saludos.

Última edición por escafandra fecha: 10-07-2012 a las 08:13:10.
Responder Con Cita
  #5  
Antiguo 10-07-2012
aoshishin1 aoshishin1 is offline
Registrado
NULL
 
Registrado: jul 2012
Posts: 9
Poder: 0
aoshishin1 Va por buen camino
Buenos dias, Escafranda mcuhas gracias por aclararmelas varias dudas con tu comentario, ahora me gustaria saber las dos cosas siguientes si eres tan amable:

1- Un hilo termina cuando termina de ejectar el execute?, o cuando ejecuto el terminate?

2- El objetivo mio era que el codigo del Frmuxiliar.mostrarcargando se corriera en segundo plano de manera que no haga trabar la ventana, perocomo este es propio del formulario no se si habra alguna forma de hacer eso, de llamar ese procedimiento y se ejecute en segundo plano sin que me haga trabar la pantalla.

Espero su pronta respuesta y muchas gracias!!
Responder Con Cita
  #6  
Antiguo 10-07-2012
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Un hilo termina cuando termina su bucle principal. Si miras el ejempo que te puse, ya no se traba al añadir Application.ProcessMessages;

Si no quieres que aparezca ningún formulario, creo que es mas lógico que no uses uno sino que tu función pertenezca al thread.

Saludos.
Responder Con Cita
  #7  
Antiguo 10-07-2012
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Cita:
Empezado por aoshishin1 Ver Mensaje
2- El objetivo mio era que el codigo del Frmuxiliar.mostrarcargando se corriera en segundo plano de manera que no haga trabar la ventana, perocomo este es propio del formulario no se si habra alguna forma de hacer eso, de llamar ese procedimiento y se ejecute en segundo plano sin que me haga trabar la pantalla.
Si lo que quieres es no acceder a ningún elemento visual del FrmAuxialiar, ningún componente de la VCL existente en él desde el Thread, entonces no te hace falta usar Synchronize. Lee en la ayuda de delphi su razón de ser. En ese caso, y al no usar Synchronize, tampoco será necesario el uso de ProcessMessages y el código funciona bien así:

Código Delphi [-]
procedure THilo.Execute;
begin
  FreeOnTerminate := True;
  while not terminated do
    FrmAuxialiar.MostrarCargando;
end;

procedure TFrmAuxialiar.MostrarCargando;
var
  i:integer;
begin
  i:=1;
  While i>0 do
    i:=i+1;
end;
Ahora lo que tienes que ver es que es lo que quieres que tu código haga.


Saludos.
Responder Con Cita
  #8  
Antiguo 10-07-2012
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
Una pregunta: ¿Pará qué utilizas un segundo hilo sólo para mostrar un panel? Mostrar un panel toma un par de milisegundos. Un tiempo invisible al usuario. Si mostrar el panel es el único propósito del hilo, te estás complicando la vida.

Si hicieras cálculos complicados que toman más de un segundo en procesarse, un hilo independiente sería una buena idea. Pero en este caso no le encuentro el sentido.

Aparte, a cómo lo estás haciendo ahora, estás introduciendo bugs en tu aplicación. En tu código veo líneas propicias a EAccessViolation.
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #9  
Antiguo 11-07-2012
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Yo creo que hasta ahora son meras pruebas de funcionamiento. El propósito final no está claro...

Saludos.
Responder Con Cita
  #10  
Antiguo 11-07-2012
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Hola, sólo añadir para aoshishin1 (¡salud!), que la funcionalidad de Synchronize es semejante a la del evento OnIdle de la aplicación (o de un objeto TApplicationEvents), es decir, el código de interés es ejecutado por el hilo principal de la aplicación (como si el hilo alterno no existiese).

Synchronize tiene mayor utilidad cuando el método Execute del nuevo hilo realiza otras tareas en verdadero segundo plano. Así, las tareas que pueden no ser seguras para hilos (thread-safe) se delegan al hilo principal a través de método Synchronize. Básicamente, las tareas no seguras para hilos son aquellas que afectan a regiones de memoria que varios hilos comparten, como puede ser cambiar o destruir un objeto al que instantes después otro hilo (como el principal) intentaría acceder.

Por otra parte, aunque sea algo sobrado para lo que busca aoshishin1, cabe mencionar que como alternativa a Synchronize está el uso de secciones críticas.

Saludos cordiales.
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
Utilizar componentes de formulario en procedimiento leogobo OOP 2 27-05-2011 06:24:36
Procedimiento Almacenado UPDATE no se ejecuta Rockin Firebird e Interbase 25 25-05-2010 20:04:50
cuando llamo ejecutar un hilo dentro del proceso del hilo no lo hace robertosc Varios 1 14-08-2007 22:11:09
procedimiento en un hilo independiente jorodgar Varios 2 04-08-2005 10:18:11
Intraweb: LLamar desde javascript a un procedimiento de un formulario Brewster Internet 0 03-07-2004 12:52:17


La franja horaria es GMT +2. Ahora son las 04:26:08.


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