Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2004
    Messaggi
    204

    [delphi ] Ciclo controlla minuti trascorsi

    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!!!

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,466
    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!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2004
    Messaggi
    204
    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.


  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,466
    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!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2004
    Messaggi
    204
    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!!!

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,466
    In tal caso, direi che un TTimer è più che sufficiente a svolgere il lavoro egregiamente.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2004
    Messaggi
    204
    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:

  8. #8
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,466
    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!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.