Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Ayuda con Hilos de ejecucion (https://www.clubdelphi.com/foros/showthread.php?t=62800)

kurono 15-01-2009 03:17:49

Ayuda con Hilos de ejecucion
 
hola amigos necesito su ayuda me estoy involugrando en la programacion multihilos en delphi e estado leyendo varios tutoriales de como crear hilos en delphi para una aplicacion y me e puesto a praticar los ejemplo que dichos tutoriales muestran pero resulta que niguno de esos ejemplo me funciona y me dan error aqui le muestro uno que e hecho pero igual no me corre me gustaria que me dijieran el que le hace falta y el que esta mal
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
  TMyhilo = class(Thread)
  private
  protected
  procedure execute;override;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
procedure TMyhilo.Execute;
begin

//aqui es donde se implementa el codigo que hira en el hilo//

end;
end.

Kipow 15-01-2009 03:52:05

primero la declaracion esta mala

Código Delphi [-]
TForm1 = class(TForm)
end;
TMyhilo = class(TThread)
protected
  procedure execute;override;
end;

segundo en el procedimiento execute no hay nada que ejecutar. seria mejor que nos
explicaras que queres hacer para poder ayudarte mejor.

kurono 15-01-2009 03:56:59

lo que quiero es aprender a utilizar la clase tthread en cualquier aplicacion que valla a necesitarlo

ElKurgan 15-01-2009 07:55:41

Si buscas en google "threads+delphi", con la opción de castellano, te aparecen algunos enlaces, el primero de ellos un tutorial que puede servirte para empezar... (en concreto a mi me salen 15.100 páginas con este tema, por lo que información no te va a faltar)

Un saludo

white_zombie 15-01-2009 09:49:33

Hola, una buena lectura para comenzar la programacion multihilo son los numeros 11,12,13,14,15,16 de la revista sintesis del grupo Albor
http://www.grupoalbor.com/sintesis/contenidos.php?id=11

Un Saludo.

Neftali [Germán.Estévez] 15-01-2009 10:04:10

Cita:

Empezado por kurono (Mensaje 334547)
lo que quiero es aprender a utilizar la clase tthread en cualquier aplicacion que valla a necesitarlo


En la sección de ejemplos de mi página hay varios sobre threads. Están con código fuente y funcionan; Échales un vistazo y a ver si te aclaras. Si no puedes pregunar aquí.
Si no recuerdo mal, en el FTP del club también hay algun ejemplo que puedes revisar.

casacham 15-01-2009 21:56:47

De consejo en consejo
 
Hola amigo "kurono", simplemente como dicen en diagnostico por imagenes: "El que no sabe que busca, no entiende lo que encuentra . . . ". Para poder aprender a programar con multihilos (dos o mas tareas ejecutandose al mismo tiempo con distinta prioridades [en resumen]) y con cualquier otra herramienta u objeto en Delphi debes tener por lo menos una idea concreta a la cual se aplique, o te daria una solucion. Asi que esta bien que leas sobre TThread, pero tambien es mejor si te propones un objetivo. Por ejemplo, este objeto te da la posibilidad de realizar otra tarea mientras buscas un archivo por el disco. Lo que vale es la imaginación. Para empezar debes tener en claro como funciona este ejemplo de Neftali. Estudia este codigo y pdras entrar al mundo multihilo.

kurono 16-01-2009 02:15:11

ok amigos estoy leyendo algunos tutoriales que e encontrado en google

kurono 16-01-2009 18:06:15

amigos disculpen e logrado hacer un hilo con la ayuda de algunos ejemplo que e contrado pero lo que no entiendo es como llamo el procedimiento execute para ejecutar el hilo

Kipow 16-01-2009 18:47:59

Cuanto lo creas le indicas si lo creas suspendido o no, asi:

Si el parametro es Verdadero el hilo no se inicia hasta que le des un resume;

Ahora bien si es falso de una vez lo ejecuta al solo crearlo.

Código Delphi [-]
TMythread := TThread.Create(true);   // Aca lo estoy creando suspendido
.
.
.
.

TMythrea.Resume; // Aca ejecuto el procedimiento execute;

kurono 16-01-2009 18:52:00

gracia amigo Kipow lo probare

kurono 16-01-2009 20:02:31

disculpa amigo Kipow pero el codigoTMythrea.Resume; me da error

white_zombie 16-01-2009 22:07:19

Hola, puedes dar algun dato mas del error o poner el codigo del thread y el codigo desde donde lo llamas.

kurono 16-01-2009 22:13:06

aqui esta parte del codigo que utilizo


Código Delphi [-]
procedure TMyhilo.execute;
 var
       N,S:integer;

             begin

          n:=1500 ;

   s:=1500;

repeat
         s:=s+n;

              inc(n);

  until n=10;

            label2.Caption :=formatdatetime('hh:nn:ss:zzz',Now - HoraInicial);

       listbox1.lines.Add('Tiempo de Respuesta del calculo en :  '+label2.Caption  +  '  Mn '+listbox1.lines.NameValueSeparator  +  ' Completada');

 if listbox1.lines.Count=22 then

                nivel1.Enabled:=false;

       tiempo.Enabled:=false;

       if listbox1.lines.Count=22 then

       begin
       listbox1.Lines.Add('++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++');

   listbox1.lines.Add('Prueba Finalizada: '+label2.Caption +' Mn');

  end;

end;
procedure TForm1.prueba1Click(Sender: TObject);
begin
 TMyhilo.Create(true);
 TMyhilo.Resume;

end;

end.

kurono 16-01-2009 22:16:21

el error que me da es este


Código Delphi [-]
[Error] Unit1.pas(534): This form of method call only allowed for class methods

white_zombie 16-01-2009 22:36:40

A simple vista ha varias cosas que no estan bien, te recomiendo que para crear el hilo vayas a File-new-Other-Thread object, te pide el nombre que deseas darle al hilo en tu caso TMyhilo. Te queda esto.

Código Delphi [-]
unit Unit2;

interface

uses
  Classes;

type
  TMyhilo = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
  end;

implementation

{ Important: Methods and properties of objects in visual components can only be
  used in a method called using Synchronize, for example,

      Synchronize(UpdateCaption);

  and UpdateCaption could look like,

    procedure TMyhilo.UpdateCaption;
    begin
      Form1.Caption := 'Updated in a thread';
    end; }

{ TMyhilo }

procedure TMyhilo.Execute;
begin
  { Place thread code here }
end;

end.

Para llamar a este hilo por ejemplo desde la unidad principal

Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,unit2;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  hilo:Tmyhilo;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
hilo:=Tmyhilo.Create(true);
hilo.Resume;
end;

Mas cosas, como veras que pone en el codigo del thread no se debe desde un hilo cambiar propiedades ni usar metodos de componentes visuales.
Para esto de usar Synchronize.

Un ejemplo

Código Delphi [-]
unit Unit2;

interface

uses
  Classes,windows;

type
  TMyhilo = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
    procedure update_label;
  end;

implementation

uses unit1;

procedure TMyhilo.Execute;
begin
  Synchronize(update_label);
end;

procedure TMyhilo.update_label;
begin
 form1.Label1.Caption:='Esto es una prueba';
end;

end.

Echale un vistazo a esto y comparalo con tu codigo.
Te recomiendo leer sobre el tema porque hay muchas cosas que saber antes de empezar a programar, los manuales que te recomende en mi primer post explica todo esto.

kurono 16-01-2009 22:39:54

ok probare eso ahora

Kipow 17-01-2009 07:13:09

Tenes que instanciar la variable, hacelo como te lo pongo y deberia de funcionar.

Código Delphi [-]
procedure TForm1.prueba1Click(Sender: TObject);
begin
 MyHilo := TMyhilo.Create(true);
 Myhilo.Resume;
end;

Philip_ 15-01-2011 15:33:37

Mira este ejemplo explica algo
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TFPrincipal = class(TForm)
EContador: TLabel;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
Tcontador= class(TThread)
dwTiempo:Dword;
iSegundos:integer;
Etiqueta:Tlabel;
constructor Create; reintroduce ; overload ;
procedure execute; override;
procedure ActualizarPantalla;
end;

var
FPrincipal: TFPrincipal;
Contador:Tcontador;

implementation

{$R *.dfm}

{ Tcontador }

procedure Tcontador.ActualizarPantalla;
begin
Etiqueta.Caption:=IntToStr(iSegundos);
end;

constructor Tcontador.Create;
begin
inherited Create(True);//lamamos al constructor padre (TThread)
dwTiempo:=GetTickCount;
iSegundos:=0;
end;

procedure Tcontador.execute;
begin
inherited;
//CONTAMOS HASTA 10SEGUNDOS
while iSegundos<10 do
//¿an pasado 1000 milisegundos?
if GetTickCount - dwTiempo>1000 then
begin
//incrementamos el contador de segundos y actualizamos la etiqueta
Inc(iSegundos);
Synchronize(ActualizarPantalla);
//Etiqueta.Caption:=IntToStr(iSegundos);
dwTiempo:=GetTickCount;

end;

end;

procedure TFPrincipal.FormCreate(Sender: TObject);
begin
Contador:=Tcontador.Create(True);
Contador.Etiqueta:=EContador;
Contador.FreeOnTerminate :=True;
Contador.Resume;
end;

end.

Philip_ 15-01-2011 15:36:40

por cierto el formulario se llama FPrincipal y se coloco en el un label que se llama EContador


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

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