Newsgroup: it.comp.lang.delphi
Titolo: Dubbio sui timer (importante)

In un'applicazione ci possono essere massimo un certo numero di timer
giusto? Quanti sono?
Se uso i timer di delphi e li setto a false, contano nel calcolo del
max numero?
Vi spiego, ho un'applicazione che crea un certo numero di finestre,
ognuna ha un timer, che viene attivato se necessario (enabled=true).
Al massimo e' attivo un timer alla volta (gli altri sono
enabled=false), ma ci potrebbero essere anche 50 timer creati (di cui
49 certamente non attivi).
Secondo voi vado in contro a quel problema?
Spero rispondiate presto perche' se fosse necessario modificare il
programma dovrei subito prodigarmi prima che si creino problemi.
Grazie Mille
Kirys
--------------------------------------------------
Brayan Fix Kirys Solfory
E-Mail: 
Ki...@technologist.com
 
For Free Software go to: 
http://Kiryssoft.cjb.net

 Kirys
Il limite sul numero dei timer è dato dal sistema operativo su cui gira il
programma,
se stai usando win95/98 il numero dei timer è limitato dal numero massimo di
handle allocabili,
il problema, ma non ne sono sicuro, si dovrebbe presentare anche con i timer
non attivi, in
ultimo ecco cosa dice l'help :
Caution: Limitations on the total number of timers system-wide are system
dependent.
Mi sembra chiaro.
Come soluzione puoi usare un solo timer che scatena un evento in ogni
oggetto registrato in una tlist.
Spero ti esserti stato d'aiuto.

 Secondo voi vado in contro a quel problema?
Ciao! Bella domanda! Allora... dopo aver letto la risposta di Carlo, non del
tutto convinto,
mi sono andato a spulciare il codice vcl del TTimer...
Per quanto mi sembra, i programmatori borland (che non sono programmatori
microzozz!!)
devono aver pensato a questa situazione, ottimizzando il codice in modo da
non utilizzare
un handle timer più del tempo necessario, infatti :
questa è la wndproc (registrata nel constructor) :
procedure TTimer.WndProc(var Msg: TMessage);
begin
  with Msg do
    if Msg = WM_TIMER then
      try
        Timer;
      except
        Application.HandleException(Self);
      end
    else
      Result := DefWindowProc(FWindowHandle, Msg, wParam, lParam);
end;
// dove  Timer è la proc. che richiama l'evento concatenato dal
programmatore che usa il componente.
Ora viene la parte importante :
Questa procedura è il metodo di write della proprietà Enabled :
procedure TTimer.SetEnabled(Value: Boolean);
begin
  if Value <> FEnabled then
  begin
    FEnabled := Value;
    UpdateTimer;
  end;
end;
Ora la UpdateTimer :
procedure TTimer.UpdateTimer;
begin
  KillTimer(FWindowHandle, 1);  //  ********
  if (FInterval <> 0) and FEnabled and Assigned(FOnTimer) then
    if SetTimer(FWindowHandle, 1, FInterval, nil) = 0 then
      raise EOutOfResources.Create(SNoTimers);
end;
*** Quando spegni (o riaccendi) il timer, l'handle del timer viene comunque
liberato alla
prima istruzione, liberando così risorse per altri timer windows.
In definitiva, se sei sicuro di tenere spenti gli altri 49 timer, allora
l'unico tuo "problema" è quello
di avere allocati 49 componenti TTimer che non stanno facendo nulla !!
Ciao!!!  Davide DG

di avere allocati 49 componenti TTimer che non stanno facendo nulla !!
beh diaciamo che se ci sono 50 finestre I 49 timer sono solo un
oggetto su tutti quelli che contiene la finestra :D
Grazie mille a tutti :D Mi avete tolto un gran peso!!
Si vede proprio lo stile dei programmatori borland!
GRAZIE ANCORA sia a te che a Carlo :D
Salutoni


 wrote:
Grazie mille per la tua risposta
