Oppure

Loading
24/05/10 13:12
a_butta
Ciao a tutti. Ho provato a costruire un timer da codice (cioè senza trascinarlo dai componenti che fornisce Delphi). Fin qui tutto bene.
Solo che il mio scopo era quello di inserire un timer in un thread.
Questo è il codice che ho provato:

...
type
 TMyTimer = class(TThread)
   Timer: TTimer;
   procedure TimerOnTimer(Sender: TObject);
 protected
   procedure Execute; override;
end;

procedure TMyTimer.TimerOnTimer(Sender: TObject);
begin
Form1.ProgressBar1.Position:= Form1.ProgressBar1.Position + 1
end;

procedure TMyTimer.Execute;
begin
Timer:= TTimer.Create(nil);
Timer.Interval := 1000;
Timer.OnTimer:= TimerOnTimer;
Timer.Enabled:= True;
Form1.Label1.Caption:= 'Thread Avviato';
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
TMyThread.Create(False);
end;


Il compilatore non mi da alcun errore. Il Label1, posto lì solo per controllo, assume regolarmente la caption 'Thread Avviato'. Tuttavia la ProgressBar1 non aumenta ne subisce alcun chè...
Non mi segnala assolutamente nulla ma non funziona... Non riesco proprio a capire dov'è l'errore, perchè se io il codice lo pongo sotto la classe TForm1 il timer funziona alla perfezione, mentre sotto il thread no...
Spero possiate aiutarmi
Grazie
aaa
25/05/10 13:25
ma a che ti serve?
25/05/10 21:33
a_butta
mi serve saperlo in generale... perchè nel programma principale, uso già un po' di Timer... vorrei sapere in generale come fare...
aaa
01/06/10 8:07
Saladino
Forse ho capito:
devi sapere che la maggior parte dei componenti che si creano hsnno bisogno di un gestore,o per meglio dire di un altro componente che li controlli.
PEr far si che il tuo timer sia controllato dallo thread fai così:

Timer := TTimer.Create(MyTimer);

Ricroda che non devi per forza distruggere il timer.
Questo sara' fatto dallo thread
Ora ciao, che devo andare a scuola.
Ultima modifica effettuata da Saladino 01/06/10 17:10
aaa
02/06/10 12:27
a_butta
dovrò provare anche questo... comunque avevo provato in un altro modo, usando il costrutto CREATE per il thread dove creare il timer e poi abilitarlo nella procedura execute:

type TMyTimer = class(TThread)
 Timer: TTimer;
 procedure TOnTimer(Sender: TObject);
protected
 procedure Execute; override;
 constructor Create(Suspended: Boolean);
end;

...

constructor TMyTimer.Create(Suspended: Boolean);
begin
inherited Create(Suspended);
Timer:= TTimer.Create(nil);
With Timer do
 begin
  Interval:= 1000;
  OnTimer := TOnTimer;
  Enabled := False;
end;
end;

procedure TMyTimer.Execute;
begin
Timer.Enabled:= True;
end;

procedure TMyTimer.TOnTimer(Sender: TObject);
begin
//CODICE DA RIPETERE NEL TIMER
end;


Così funziona... non ho capito però bene "perchè" :D
Grazie mille comunque...
aaa