Italian community of Lazarus and Free Pascal
Programmazione => Graphics => Topic aperto da: Fabio - Dicembre 14, 2011, 03:52:28 pm
-
Ho una procedura che cicla su tutti i file e directory e dovrebbe aggiornare un controllo con dei parametri, dico dovrebbe perchè la finestra esce solo quando il ciclo è terminato quindi l'applicazione risulta come bloccata fino a che non finisce.
In visual basic se non ricordo male si usava DoEvents o una roba simile per dare un po' di ossigeno al programma e dargli il tempo di aggiornare le finestre e i controlli, qui come si fa?
Ho già provato Application.Processmessages, Refresh, Repaint e Update ma niente da fare, quando parte il ciclo si blocca tutto e si sblocca solo quando il ciclo è terminato.
-
Aggiorno il thread, dunque il problema è che la procedura viene eseguita all'apertura di un form che viene usato per mostrare l'avanzamento della procedura, e il form non viene proprio mostrato.
Se io sposto l'avvio della procedura dal FormShow a un FormClick e avvio la procedura a mano con un click allora mettendo un Update nel ciclo si vede l'aggiornamento delle statistiche in tempo reale.
Quindi cambio la domanda in, come fare a far partire una procedura dopo che il form supplementare risulta caricato e visibile ?
-
E già che ci sono rincaro anche la dose ;D , come posso far si che l'utente possa interrompere la procedura?
Ok che il form viene aggiornato però l'applicativo è comunque ingestibile, anche se ho un pulsante per annullare non riesco a cliccarlo fino a che la procedura è terminata.
Grazie.
-
Allora, metti quel codice in un timer. Il timer lo fai partire all'apertura della form valorizzando il parametro .Intervall a un valore superiore a 0 (si tratta dei millisecondi). E all'avvio del tuo timer imposti il paratetro interval=0 in maniera tale da eseguire quel blocco di codice una volta sola. Esempio
procedure TForm1.FormShow(Sender: TObject);
begin
timer1.interval:=100;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
timer1.interval:=0;
{tuo blocco di codice}
end;
-
Ok perfetto, per l'avvio a form visibile è ok funziona.
Se avete poi un idea di come poter cliccare il pulsante che risulta non cliccabile fino al termine della procedura fate un fischio.
Grazie.
-
Credo che l'unico modo per fare quello che dici sia la programmazione Multithreaded. Prova a dare un occhiata a questo tutorial
http://wiki.lazarus.freepascal.org/Multithreaded_Application_Tutorial
-
Leggendo quel documento ho trovato la risposta, non mi serve il multithread infatti anche li sconsigliano salvo rari casi, basta mettere Application.ProcessMessages ogni tanto nel ciclo, io l'ho messo nel momento in cui aggiorno a video le statistiche ( circa mezzo secondo )
L'avevo già provato ma si vede sbagliavo a usarlo.
-
Bene comunque, vuol dire che hai risolto lo stesso :)