Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #21  
Antiguo 24-05-2005
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 23
Crandel Va por buen camino
Post

Aca te adapte un ejemplo que tenía para que funcione como componente.
Probalo.
Te podes basar en él para el tuyo.

Código Delphi [-]
unit ProgressThread;

interface

uses
  Classes, SysUtils, ComCtrls;

type

  TProgressThread = class(TThread)
  private
    Progreso: Word;
    blnStop: Boolean;
    procedure UpdateControl;
  protected
    procedure Execute; override;
  public
    Progress: TComponent;
    procedure Stop;
  end;


  TProgressAutoInc = class(TProgressBar)
  private
    FActivo: Boolean;
    Thread: TProgressThread;
  public
    property Activo: boolean read FActivo;
    constructor Create(AOwner: TComponent); override;
    procedure Play;
    procedure Stop;
  end;


procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Samples', [TProgressAutoInc]);
end;

procedure TProgressThread.Execute;
begin
  if (Progress is TProgressBar) then
    with Progress as TProgressBar do
      Progreso := Position;
  blnStop := False;
  while ( (not blnStop) and (not Terminated) and (Progreso<=100) ) do
  begin
    Inc(Progreso);
    Synchronize(UpdateControl);
    Sleep(50);
    if Progreso=100 then Progreso := 0;
  end;
end;

procedure TProgressThread.Stop;
begin
  blnStop := True;
end;

procedure TProgressThread.UpdateControl;
begin
  if (Progress is TProgressBar) then
    with Progress as TProgressBar do
      Position := Progreso;
end;

procedure TProgressAutoInc.Play;
begin
  Thread := TProgressThread.Create(true);
  with Thread do
  begin
    Progress := Self;
    FreeOnTerminate := true;
    Priority := tpNormal;
  end;
  Thread.Resume;
  FActivo := true;
end;

procedure TProgressAutoInc.Stop;
begin
  if FActivo then
    Thread.Stop;
  FActivo := false;
end;

constructor TProgressAutoInc.Create(AOwner: TComponent);
begin
  inherited create(AOwner);
  FActivo := false;
end;

end.
__________________
[Crandel]

Última edición por Crandel fecha: 24-05-2005 a las 00:24:07.
Responder Con Cita
  #22  
Antiguo 25-05-2005
elcigarra elcigarra is offline
Miembro
 
Registrado: may 2005
Posts: 269
Poder: 20
elcigarra Va por buen camino
Gracias Crandel!!! Te debo una cerveza.

El problema era la estrategia, yo utilizaba valores de las variables del componente padre del thread. Tu ejemplo crea una variable de tip TComponent que pertenece al thread... Así funciona perfecto. Gracias de nuevo... a todos
Responder Con Cita
  #23  
Antiguo 25-05-2005
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Cool

Hola. Creo que hay un problema de terminología por aqui.

Cita:
Empezado por elcigarra
El problema era la estrategia, yo utilizaba valores de las variables del componente padre del thread.
El thread, como tal, y en la jerga de la vcl, no tiene un "padre" (parent), ni un "dueño" (owner). Asi que aunque vos le otorgues la paternidad a alguien, este no es un término que ayude a entendernos.

Cita:
Empezado por elcigarra
Tu ejemplo crea una variable de tip TComponent que pertenece al thread...
Nuevamente, el "progress" del ejemplo de Crandel no pertenece al thread como tal. Mas bien está referenciado por un miembro de este. (Y se espera que cada instancia particular de TProgressThread apunte a una instancia distinta de algún componente en su propiedad "progress". (no he analizado lo suficiente el código para saber que ocurriría si esto no se cumple).

Cita:
Empezado por elcigarra
Así funciona perfecto. Gracias de nuevo... a todos
Para aclarar finalmente el punto, esta independencia que permite que funcione perfecto, es porque cada thread accede a propiedades o miembros (variables) de distintas instancias de objetos.
Nada impide que distintos hilos de ejecución consulten o modifiquen valores de cualquier dirección de memoria accesible al proceso (incluso propiedades de otros threads)... y precisamente en hacer que este acceso se de de manera controlada consiste la programación "thread-safe", puesto que dos hilos podrian confundirse al usar las mismas variables (tu caso) o machacar el trabajo de otros threads (también tu caso ).

Cita:
Empezado por elcigarra
Gracias Crandel!!! Te debo una cerveza.
Y yo... ¿que?

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #24  
Antiguo 25-05-2005
elcigarra elcigarra is offline
Miembro
 
Registrado: may 2005
Posts: 269
Poder: 20
elcigarra Va por buen camino
Cita:
Empezado por jachguate
Hola. Creo que hay un problema de terminología por aqui...
Como sea, Jachguate... Pero que funciona, funciona. Ojalá algún día maneje estos asuntos como lo hacés tú. Por ahora me contento con que las cosas funcionen (concedeme por lo menos el atenuante que empecé a utilizar threads hace no más de 20 días y los únicos cursos serios de programación que hice fue uno de basic hace 17 años y con sistema operativo CPM y uno de Clipper con sistema DOS. Todo lo demás fue preguntando... como ahora. En todo caso mis clientes no se dan cuenta de lo poco que sé )

Cita:
Empezado por jachguate
Y yo... ¿que?
a) Gran aporte con el asunto del synchronize. Después faltó algo de código explicativo con el tema de las variables
b) Fue incluido en el "todos" cuando dije "Gracias de nuevo... a todos".
c) La cerveza es barata, también te debo una
Responder Con Cita
  #25  
Antiguo 25-05-2005
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Cita:
Empezado por elcigarra
Como sea, Jachguate... Pero que funciona, funciona. Ojalá algún día maneje estos asuntos como lo hacés tú.
Bueno, precisamente por eso va la aclaración de terminología que, creeme, lo he hecho de forma muy amigable y con el afán de ayudar.

Cita:
Empezado por elcigarra
En todo caso mis clientes no se dan cuenta de lo poco que sé )
En este punto me confundis... hace unos días pensé que eras empleado en alguna firma de programación... cuando hablaste de ser despedido, y ahora resulta que sos empresario, con clientes propios y eso.... no es mejor una cosa que la otra y francamente no hace la diferencia, pero.. me confundis...

Cita:
Empezado por elcigarra
a) Gran aporte con el asunto del synchronize. Después faltó algo de código explicativo con el tema de las variables
¿debiera pedir perdón?

Cita:
Empezado por elcigarra
c) La cerveza es barata, también te debo una
me referia precisamente a eso... ahora ya están las cuentas claras..

buen rollo.
__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #26  
Antiguo 26-05-2005
elcigarra elcigarra is offline
Miembro
 
Registrado: may 2005
Posts: 269
Poder: 20
elcigarra Va por buen camino
Te pasó lo mismo que a mi con los threads sacando conclusiones apresuradas. Que desarrolle software no significa que trabaje en informática y que tenga clientes no significa que sea empresario. La verdad es que trabajo en un laboratorio y una parte (relativamente menor) de mi trabajo es desarrollar sofware de instrumentación virtual para manejar equipos de precisión. Mis clientes son internos.

Yo sé que no tenía que responder, pero después de tanto aporreo dame el gusto de ganar una...
Cambio y fuera.
Responder Con Cita
  #27  
Antiguo 26-05-2005
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 23
Crandel Va por buen camino
Wink

Me alegro que te haya servido.

Si un dia paso por Montevideo paso para que tomemos la cerveza, y si estas por aca te invito yo.

Recuerda de no ocupar Application.ProcessMessages en tu aplicación multihilo, salvo que sea realmente necesario.

Saludos
__________________
[Crandel]
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


La franja horaria es GMT +2. Ahora son las 21:29:18.


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