PDA

Visualizza la versione completa : [delphi ] Ciclo controlla minuti trascorsi


FilSWS
05-10-2004, 16:32
Ho l'esigenza di lanciare un comando ogni minuto.

Come fate voi a fare questo controllo??

Mi basta un qualcosa di semplice che faccia passare un minuto, che non sia TTimer o Thread.

C'è qualche funzione particolare o bisogna implementare un ciclo o qualcosa del genere.

Ho provato con un ciclo while ma mi occupa il 100% della CPU!!! :cry:

alka
05-10-2004, 16:45
Puoi utilizzare la funzione API Sleep che accetta i millisecondi di attesa come parametro...ma sappi che la tua applicazione rimane ovviamente bloccata (serve proprio ad evitare che la CPU vada al 100% quando si programma a livello multithreading).

L'unica soluzione che si adatta al tuo problema è l'uso del TTimer, ma non capisco come mai lo hai escluso.

Ciao! :ciauz:

FilSWS
05-10-2004, 17:17
Ti spiego:
Ho mostrato al cliente la barra di scorrimento e non gli piaceva :(
e visto che "IL CLIENTE HA SEMPRE RAGIONE" ha voluto sostituire la barra con un oggetto Animate ( con l'animazione della lente che gira non so se hai presente!! )
Quindi ho fatto in modo che quando l'utente lancia la procedura faccio

animate.visible := true

e quando finisce faccio

animate.visible := false

ma rimane sempre il problema di far passare un tot di minuti tra una spedizione di dati e l'altra ( non mi dilungo su cosa deve fare il programma!!)

quindi ho messo un ciclo

Adesso := Time();
Arrivo := Time() + (numero di minuti da aspettare)
while Adesso <= Arrivo do
begin
Adesso := Time();
end;

Questo ciclo farebbe al caso mio. Aspetto il tempo neccessario e poi proseguo con le istruzioni.
Ma questo mi occupa il 100% della CPU e l'utente deve avere la possibilità di terminare bruscamente l'applicazione in quel periodo di pausa premendo un bottone con su scritto "interrompi" che non riesco a premere.

:bhò:

alka
05-10-2004, 17:33
Appunto: la soluzione più semplice è attivare un TTimer. Imposti un intervallo (Interval) di 1000 millisecondi (un minuto) e quando l'evento del timer viene generato, disabiliti innanzitutto il timer e successivamente nascondi l'animazione.

Quando il processo viene avviato, si abilita il timer e il pulsante di interruzione; se si preme questo pulsante, il timer viene arrestato.

Mi risulta ancora oscuro un fatto: il tuo programma lavora effettivamente per un minuto oppure il minuto di attesa è fittizio? In tal caso, l'animazione si può visualizzare all'avvio del processo e nascondere alla fine, mentre l'intercettazione della pressione di "Interrompi" è possibile solo usando una procedura ciclica con una chiamata al metodo Application.ProcessMessages oppure attraverso un thread esterno.

Ciao! :ciauz:

FilSWS
05-10-2004, 18:07
dipende..
questo programma lavora a intervalli di tempo decisi dall'utente
(io ho messo un minuto per fare un esempio).
Questo programma (che inizio ad odiare!!) e stato pensato per ovviare ad un problema di saturazione del buffer di una stampante termica (costruita circa 200 anni fa).
Questa stampante si appoggia ad una sua interfaccia che a sua volta funziona tramite una tabella DBF.
Essendo il tutto in un 386 o 486 al massimo, se il dbf contiene più di 10 record la macchina si pianta cosi spedisco a intervalli di tempo ancora da stabilire 10 record alla volta, svuoto il dbf e lancio la stampa..

funziona tutto tranne il fatto dell'attesa!!!

alka
05-10-2004, 18:12
In tal caso, direi che un TTimer è più che sufficiente a svolgere il lavoro egregiamente. :)

FilSWS
05-10-2004, 18:18
un ultima cosa..
io setto a design time nelle proprietà del TTimer
interval = 1000
enabled = false

poi nel punto che mi interessa del mio pgm setto

timer.enabled := true;

io qui mi aspetto che faccia passare 1000 millisecondi

e subito dopo

timer.enabled := false;

per spegnerlo!?!? :master:

alka
05-10-2004, 18:21
Quando il TTimer viene abilitato, Windows invia alla tua applicazione un messaggio ogni n millisecondi (l'intervallo impostato sul Timer) che viene intercettato dal componente il quale genera poi l'evento OnTimer.

Quando inibisci il Timer impostando Enabled al valore booleano False, quel messaggio non viene più inviato.

Ciao! :ciauz:

Loading