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 13-08-2010
Avatar de flystar
flystar flystar is offline
Miembro
 
Registrado: jul 2006
Posts: 184
Poder: 18
flystar Va por buen camino
Question Aprendiendo Hilos, (no corre como un hilo)

Hola Hermanos.

Estoy aprendiendo a programar hilos, hice un ejemplo muy simple
de un programa que cada segundo que pasa le cambia el titulo a una venta
a 1 y luego 2 y luego 3 y asi sucesivamente, el objetivo es que dicha acción
la haga por medio de un hilo de ejecución, y la forma de saber si lo esta haciendo así es que durante el proceso podamos arrastrar nuestra aventana
con el mouse o apretarle a otro boton y que haga algo simple como cambiar el color de la ventana etc, ustedes saben.

El problema es que al ejecutar el hilo...si funciona, pero no me libera la ventana, pareciera que no se estuviera ejecutando realmente en un hilo.

Quiero ver si alguien de alma caritativa me pudiera decir que estoy haciendo mal.

Enseguida tratare de explicar el código simple que uso:

Aqui, simplemente declaro un nuevo objeto de clase TThread:

Código:
type
  CambiaTituloEnHilo= class(TThread)
  private
    Procedure Actualiza_Ttitulo_Ventana;
    { Private declarations }
  protected
    procedure Execute; override;
  end;
Luego declaro el constructor que manda llamar al procedimiento del objeto hilo:

Código:
procedure CambiaTituloEnHilo.Execute;
begin
  Synchronize(Actualiza_Ttitulo_Ventana)
end;
Luego declaro el procedimiento Actualiza_Ttitulo_Ventana:

Código:
Procedure CambiaTituloEnHilo.Actualiza_texto;
var
inicio:integer;
begin
  inicio:=1;
  for inicio:=1 to 400 do
  begin
        form1.Caption:=inttostr(inicio);
        sleep(1000); //Espera un segundo
   end
end;
y luego para arrancar el hilo, pues solo creo un objeto de la clase
CambiaTituloEnHilo, esto puede ser al apretar un boton y cuando eso pase pues el constructor execute
se mandara llamar:

Código:
  MiHilo:=CambiaTituloEnHilo.Create(false);
y listo....pero que creen??? NO funciona jejeje
Osea si funciona..si cambia el titulo de la ventana pero me inhibe la ventana.

Pues que estoy haciendo mal?

Gracias.
__________________

"Los unicos que no se equivocan son aquellos que no intentan hacer algo."
Iván Caballero Cano...
ivanhalen77@gmail.com
Responder Con Cita
  #2  
Antiguo 13-08-2010
Avatar de DarkMan
DarkMan DarkMan is offline
Miembro
 
Registrado: jul 2006
Posts: 102
Poder: 18
DarkMan Va por buen camino
Te aconsejo que te informes sobre el procedimiento "Synchronize", porque al parecer no has entendido la dinámica ni el funcionamiento del mismo.

Todo lo que ejecutes en el procedimiento pasado a "Synchronize" se ejecuta en el hilo principal, logrando una sincronización de todos los hilos. Por ello se produce el "cuelgue" de tu aplicación. Ese cuelgue se debe al procedimiento "Sleep", el cual bloquea al hilo durante 1000 milisegundos. Tan solo debes alterar el código como te indico a continuación, ejecutando dicho procedimiento dentro del "Execute" del hilo:

Código Delphi [-]
procedure CambiaTituloEnHilo.Execute;
var
inicio:integer;
begin
  for inicio:=1 to 400 do
  begin
        Synchronize(Actualiza_Ttitulo_Ventana);
        sleep(1000); //Espera un segundo
  end;
end;

Código Delphi [-]
Procedure CambiaTituloEnHilo.Actualiza_Ttitulo_Ventana;
begin
        form1.Caption:=inttostr(inicio);
end;
__________________
"La recompensa de una buena acción está en haberla hecho"
Responder Con Cita
  #3  
Antiguo 13-08-2010
Avatar de flystar
flystar flystar is offline
Miembro
 
Registrado: jul 2006
Posts: 184
Poder: 18
flystar Va por buen camino
Gracias

y si lo bloquea por que lo volviste a poner??

Saludos
__________________

"Los unicos que no se equivocan son aquellos que no intentan hacer algo."
Iván Caballero Cano...
ivanhalen77@gmail.com
Responder Con Cita
  #4  
Antiguo 13-08-2010
Avatar de DarkMan
DarkMan DarkMan is offline
Miembro
 
Registrado: jul 2006
Posts: 102
Poder: 18
DarkMan Va por buen camino
Cita:
Empezado por flystar Ver Mensaje
y si lo bloquea por que lo volviste a poner??

Saludos
La cuestión no es si ponerlo o no, la cuestión es dónde ponerlo.
Tu error era colocarlo dentro del procedimiento que ejecutas mediante Synchronize().

Creo que debes releer mi respuesta anterior de nuevo, con detenimiento.

Un saludo.
__________________
"La recompensa de una buena acción está en haberla hecho"
Responder Con Cita
  #5  
Antiguo 14-08-2010
Avatar de flystar
flystar flystar is offline
Miembro
 
Registrado: jul 2006
Posts: 184
Poder: 18
flystar Va por buen camino
Pregunta

Tienes razon, ya lo arregle,

La onda es que quiero hacer un auto arranque de un programa
para que se actualize solo a la nueva version y luego arranque,

para tal motivo necesitaba de hilos para que al ir bajando el programa
con otro hilo fuera consultando el tamaño del archivo bajado,
ahora la bronca es que el hilo que mide el tamaño del archivo bajandose
solo funciona en los primeros momentos de la descarga, y luego cuando termina de descargar el archivo, vuelve a recuperar su funcion el hilo que da el tamaño.

Es normal?
__________________

"Los unicos que no se equivocan son aquellos que no intentan hacer algo."
Iván Caballero Cano...
ivanhalen77@gmail.com
Responder Con Cita
  #6  
Antiguo 14-08-2010
Avatar de flystar
flystar flystar is offline
Miembro
 
Registrado: jul 2006
Posts: 184
Poder: 18
flystar Va por buen camino
Question Jalo pero a medias

La funcion que uso para obtener el tamaño es esta:

Código:
function tamanoFichero2 (sFileToExamine: string) : Integer;
var
  SearchRec: TSearchRec;
  sgPath: string;
  inRetval, I1: Integer;
begin
  sgPath := ExpandFileName(sFileToExamine);
  try
    inRetval := FindFirst(ExpandFileName(sFileToExamine), faAnyFile, SearchRec);
    if inRetval = 0 then
      I1 := SearchRec.Size
    else
      I1 := -1;
  finally
    SysUtils.FindClose(SearchRec);
  end;
  Result := I1;
end;
La pongo en otro hilo mediante otra clase de clase hilo jeje.
Creo el hilo que va bajar el archivo y luego el hilo que va a ir midiendolo

Código:
  midescarga:=TDescarga.Create(false);
        miDiceElTamanio:=TDiceTamanio.Create(false)
nomas que el seguno hilo nomas jala durante los primeros amomentos
y luego ya se frenaz y cuando termina el otro entonces ya se recupera.
Algo quizas haga mal...que sera? Alguien lo sabe?

La parte donde declaro los objetos es esta:

Código:
TDescarga = class(TThread)
  private
  protected
    procedure Execute; override;
end;

TDiceTamanio = class(TThread)
  private

  protected
    procedure Execute; override;
    procedure llamaDecirTamanio;
    function tamanoFichero2 (sFileToExamine: string) : Integer;
end;
__________________

"Los unicos que no se equivocan son aquellos que no intentan hacer algo."
Iván Caballero Cano...
ivanhalen77@gmail.com
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 paso el alias a un programa que corre en un PC sin delphi ? Parsec Conexión con bases de datos 4 06-06-2008 01:12:24
Como usar dbExpress en hilos ? rolandoj Conexión con bases de datos 7 05-03-2008 21:12:32
cuando llamo ejecutar un hilo dentro del proceso del hilo no lo hace robertosc Varios 1 14-08-2007 22:11:09
Como grabar mientras la aplicacion corre? principiante22 Varios 3 01-07-2007 19:12:01
Como detectar el S.Operativo donde corre Firebird pcicom Conexión con bases de datos 2 23-06-2005 23:16:30


La franja horaria es GMT +2. Ahora son las 20:32:55.


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