Newsgroup: it.comp.lang.delphi
Titolo: come potrei fare secondo voi?

Se io avessi un' applicazione come questa(non visuale)
program XXX;
uses
    ABCD;
{$R *.RES}
begin
    Azione;
end.
Cosa dovrei fare per ripetere "Azione" ogni 2 minuti? senza usare le VCL?
<< Fred...@Libero.it >>

Marco <>Knack<> ha scritto nel messaggio ...

Dovresti usare un timer. Non il TTimer, ma quelli ottenibili direttamente
con le API, e poi intercettare i messaggi. In alternativa, sappi che anche
se una finestra non è visuale, si possono sempre usare i componenti,
creandoli a runtime. Ma penso che la VCL non vuoi proprio linkarla...
Ciao !            {MSX}

 wrote in message
xVjl4.41421$C3.4...@news.infostrada.it...


> 
puoi usare le api di windows?
procedure waitsec( millisec : DWORD );
var endtick : DWORD;
begin 
 endtick := gettickcount+millisec;
 while ( gettickcount < endtick ) do application.processmessages;
end;
aspettare 2 minuti e' una chiamata a 
waitsec( 120000 )
ciao ciao, Luca.
-- 
ICQ: 11024183
L'amore e' una malattia e, come tale, si cura andando a letto.

 Cosa dovrei fare per ripetere "Azione" ogni 2 minuti? senza usare le VCL?
Se accetti di includere la unit Windows (una decina di Kb direi) puoi usare
l'API SetTimer o un ciclo sulla GetTickCount o simili (puoi anche sfruttare
la GetSystemTime, insomma, puoi usare le funzioni standard di sistema...)
Se invece proprio non vuoi includere nulla, sei messo male: l'unica cosa che
mi viene in mente sarebbe un ciclo sul clock del bios ma direi che non ne
vale la pena...
Ciao :-)
--
(¯`·.¸¸.·´¯`·.¸¸.-> Andrea <-.¸¸.·´¯`·.¸¸.·´¯)
AntiSpam: rimuovere il trattino basso dall'indirizzo per rispondere
AntiSpam: remove the underscore from the e-mail address to reply

>



    Soluzione "brutale" per non includere Windows. Cercare all'interno di
essa l'import di GetTickCount e copiarlo nel progetto... Così non sei
costretto ad utilizzare la Unit, ma deve valerne la pena...
    Saluti!
--
______________________________________
Gian Luca Dalla Torre
E - Mail: 
gianluca....@casteo.net
______________________________________

 costretto ad utilizzare la Unit, ma deve valerne la pena...
Direi che è decisamente un'ottima soluzione, non ci avevo pensato...
L'import non è complesso,è una funzione del Kernel e dovrebbe bastare:
function GetTickCount: LongInt; stdcall; external 'KERNEL32.DLL';


Cosa dovrei fare per ripetere "Azione" ogni 2 minuti? senza usare le VCL?
ci sono diversi modi.
O ti inventi una procedura tu (ricorsiva....dovrebbe funzionare)  oppure
utilizzi il componente TTimer creandolo a Run-Time, oppiure utilizzi l' API
SetTimer.
Se vuoi un esempio pratico scrivimi in privato, ora sono molto di fretta !!!
Antonio Tarolla
BSSoftware Tips Mailing - List Support




application.processmessages comunque l'ho tolto e funziona allo stesso
modo.
Application.ProcessMessages serve per processare i messaggi che stanno nella
coda dell' applicazione.
In pratica quando tu esegui un ciclo che ha una durata indeterminata
(superiore a qualche secondo ecc) la tua applicazione (monothread) rimane
bloccata per la durata della routine. In quel lasso di tempo non potrai
premere un pulsante, ne spostare la finestra ecc.... perchè la routine si
succhia tutto, diciamo che è prioritaria per capirci. In effetti quando
esegui una procedura, questa termina subito e per questo tu riesci a fare
altre operazioni. Ma quando la procedura è ricorsiva e richiede un bel po'
di tempo, finchè non termina tu sarai bloccato !!!
Una soluzione al problema è Application.ProcessMessages che metti nel ciclo
e ti risolve il problema. (almeno in parte)
Una soluzione migliore è l' utilizzo (quindi l' aggiunta) di un thread che
esegue il ciclo o la routine.
In questo modo la tua Form con tutti i pulsanti può continuare ad eseguire i
compiti più semplici e rimane libera mentre il thread si preoccupa della
routine.
Ok, spero di essere stato chiaro.
Per qualche dubbio scrivi pure !!


 >>


 wrote in message
aPqm4.63496$C3.6...@news.infostrada.it...


 wrote in message
qhFn4.85424$C3.9...@news.infostrada.it...


Che ne dici di questo ?
Program ProjectTimer;
  uses windows;
{ Potresti anche non usare la Windows (cmq non linka nulla!), dichiarando la
Sleep cosě :
procedure Sleep(dwMilliseconds: Cardinal); stdcall;forward;
procedure Sleep; external 'kernel32.dll' name 'Sleep';
}
Var Ticks : cardinal;
BEGIN
 Ticks := 0;
Repeat
 //  ... azioni ...
 sleep (numero millisecondi);
 Inc (Ticks);
until (Ticks >= Tempo totale) or altra condizione;
END.
Nota : Ho fatto la prova col monitor di risorse ... la cpu non viene
impegnata durante Sleep
 (non si sa mai ... stiamo sempre parlando di Api della Microsoft !!!), perň
ho notato uno strano
"picco" _perenne_ a 100% quando il programma č bello che chiuso (che si
chiude sono sicuro).
Ciao.
Davide DG
