Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Delphi - Timer in un Thread da codice.
Forum - Delphi - Timer in un Thread da codice.

Avatar
a_butta (Member)
Expert


Messaggi: 578
Iscritto: 16/03/2010

Segnala al moderatore
Postato alle 15:12
Lunedì, 24/05/2010
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:

Codice sorgente - presumibilmente Delphi

  1. ...
  2. type
  3.  TMyTimer = class(TThread)
  4.    Timer: TTimer;
  5.    procedure TimerOnTimer(Sender: TObject);
  6.  protected
  7.    procedure Execute; override;
  8. end;
  9.  
  10. procedure TMyTimer.TimerOnTimer(Sender: TObject);
  11. begin
  12. Form1.ProgressBar1.Position:= Form1.ProgressBar1.Position + 1
  13. end;
  14.  
  15. procedure TMyTimer.Execute;
  16. begin
  17. Timer:= TTimer.Create(nil);
  18. Timer.Interval := 1000;
  19. Timer.OnTimer:= TimerOnTimer;
  20. Timer.Enabled:= True;
  21. Form1.Label1.Caption:= 'Thread Avviato';
  22. end;
  23.  
  24. procedure TForm1.Button1Click(Sender: TObject);
  25. begin
  26. TMyThread.Create(False);
  27. 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

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 15:25
Martedì, 25/05/2010
ma a che ti serve?

PM Quote
Avatar
a_butta (Member)
Expert


Messaggi: 578
Iscritto: 16/03/2010

Segnala al moderatore
Postato alle 23:33
Martedì, 25/05/2010
mi serve saperlo in generale... perchè nel programma principale, uso già un po' di Timer... vorrei sapere in generale come fare...

PM Quote
Avatar
Saladino (Member)
Pro


Messaggi: 90
Iscritto: 30/05/2010

Segnala al moderatore
Postato alle 10:07
Martedì, 01/06/2010
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 il 01/06/2010 alle 19:10
PM Quote
Avatar
a_butta (Member)
Expert


Messaggi: 578
Iscritto: 16/03/2010

Segnala al moderatore
Postato alle 14:27
Mercoledì, 02/06/2010
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:

Codice sorgente - presumibilmente Delphi

  1. type TMyTimer = class(TThread)
  2.  Timer: TTimer;
  3.  procedure TOnTimer(Sender: TObject);
  4. protected
  5.  procedure Execute; override;
  6.  constructor Create(Suspended: Boolean);
  7. end;
  8.  
  9. ...
  10.  
  11. constructor TMyTimer.Create(Suspended: Boolean);
  12. begin
  13. inherited Create(Suspended);
  14. Timer:= TTimer.Create(nil);
  15. With Timer do
  16.  begin
  17.   Interval:= 1000;
  18.   OnTimer := TOnTimer;
  19.   Enabled := False;
  20. end;
  21. end;
  22.  
  23. procedure TMyTimer.Execute;
  24. begin
  25. Timer.Enabled:= True;
  26. end;
  27.  
  28. procedure TMyTimer.TOnTimer(Sender: TObject);
  29. begin
  30. //CODICE DA RIPETERE NEL TIMER
  31. end;



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

PM Quote