Ok.Originariamente inviato da FilSWS
Ho scritto una piccola applicazione che mi permette di spedire ogni tot di minuti una serie di dati ad una stampante...
L'utente sceglie ogni quanti minuti spedire questi dati per esempio 1 minuto.
Non mi pare una scelta molto azzeccata perchè, tendenzialmente, il ciclo while impiega molta CPU se non viene inserito un "riposo"; inoltre, l'applicazione risulta bloccata quando il programma elabora i dati o rimane in attesa di farlo.Originariamente inviato da FilSWS
Per far passare questo minuto ho fatto un ciclo while che mi controlla quanto tempo è trascorso e mi fa scorrere una ProgressBar in modo da far capire all'utente che il programma non si è piantato.
Non riesce ad intercettarlo poichè il ciclo del programma e l'eventuale attesa che si svolgono nel thread dell'applicazione precludono la gestione del messaggio corrispondente alla pressione del tasto.Originariamente inviato da FilSWS
Sto cercando di inserire un tasto interrompi per terminare bruscamente la procedura ( poniamo si inceppi la carta ) ma non riesco ad intercettarlo e nemmeno una combinazione di tasti es ctrl-alt-I nei vari eventi on_key_down.
Il comportamento è probabilmente dovuto al fatto che il ciclo che hai introdotto nel programma impedisce anche la gestione degli eventi legati al "refresh" grafico dell'applicazione.Originariamente inviato da FilSWS
Quando appare la ProgressBar la maschera sfarfalla ed è come bloccata![]()
Molto probabilmente, si tratta di DoEvents, che esiste anche in Delphi come metodo dell'oggetto Application: Application.ProcessMessages.Originariamente inviato da FilSWS
Mi ricordo che in VB6 richiamavo una funzione per fare in modo di "scaricare" la maschera dalla memoria velocemente e questo mi permetteva di premere i tasti.
Esiste una cosa simile in delphi oppure cosa ho sbagliato??
Tale metodo è funzionale quanto pericoloso, poichè nel punto in cui è richiamato indica all'applicazione di gestire tutti i messaggi presenti in coda (tra cui disegno, clic su pulsanti e altri ancora) prima di proseguire l'elaborazione; tuttavia, nella coda potrebbero essere presenti messaggi di chiusura del form, di shutdown del sistema, di terminazione del programma e così via che, se sopraggiungono durante l'elaborazione, comporterebbero un crash.
In VB l'uso di DoEvents è tollerabile (prendendo anche in quel caso tutte le precauzioni), ma in Delphi - essendoci i Thread - è una soluzione che giudico assurda e da evitare per qualsiasi software, anche il più semplice, che sia sviluppato con un minimo di professionalità.
Creare un thread è semplicissimo, ed è una soluzione che ti permette di avviare una routine, magari continuata (il tuo ciclo while) in modo asincrono rispetto al percorso di esecuzione del programma principale che rimane quindi libero di "respirare" e intercettare gli eventi, tra cui la pressione di un tasto in grado di fermare tale thread o sospenderlo per risolvere eventuali problemi.
La trattazione dei thread è molto lunga, quindi non posso descriverti tutto ciò che c'è da sapere in questo contesto, ma posso fornirti un link ad un tutorial molto interessante e ben fatto, a mio avviso, sull'argomento:
Tutorial sui Thread.