Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: xinyiman - Dicembre 13, 2012, 04:24:47 pm

Titolo: sleep che si puo interrompere
Inserito da: xinyiman - Dicembre 13, 2012, 04:24:47 pm
Chi mi sa dire come si puo effettuare una sleep di 10 min che si possa interrompere anche prima se uno decidesse di volerlo fare?!
Titolo: Re:sleep che si puo interrompere
Inserito da: bonmario - Dicembre 13, 2012, 06:00:32 pm
Se esiste un modo diretto non lo so. Casomai non lo trovassi, potresti fare un ciclo di sleep di x secondi alla volta (5 o 10 secondi, poi vedi tu come ti trovi meglio). Ogni x secondi fai un Application.ProcessMessages. Il ciclo lo interrompi quando passi i 10 minuti o quando l'utente ha cliccato sul bottone dell'interruzione.

Ciao, Mario
Titolo: Re:sleep che si puo interrompere
Inserito da: Stilgar - Dicembre 13, 2012, 11:44:14 pm
Urca ... messa così mi viene in mente subito una soluzione (Windows Based).
Imposto un time out di 10 minuti con un timer.
Faccio fare il resto delle cose all'applicazione, Quando suona la "sveglia" faccio quello che mi serviva ...
Se uno disinnesca il detonatore con un bottone, interrompo il timer...
Fattibile come cosa?
Stilgar

Titolo: Re:sleep che si puo interrompere
Inserito da: nomorelogic - Dicembre 14, 2012, 03:17:28 pm
si ma uno sleep è una cosa e una sveglia è un'altra.
durante lo sleep l'applicazione non dovrebbe fare nulla mentre una sveglia è un timer che attende qualcosa.

@xinyiman
quando dicevi sleep di 10 minuti intendevi anche il blocco dell'applicazione?
Titolo: Re:sleep che si puo interrompere
Inserito da: xinyiman - Dicembre 14, 2012, 04:46:49 pm
si ma uno sleep è una cosa e una sveglia è un'altra.
durante lo sleep l'applicazione non dovrebbe fare nulla mentre una sveglia è un timer che attende qualcosa.

@xinyiman
quando dicevi sleep di 10 minuti intendevi anche il blocco dell'applicazione?

Più che il blocco dell'applicazione quello del thread...
Titolo: Re:sleep che si puo interrompere
Inserito da: nomorelogic - Dicembre 14, 2012, 06:00:20 pm
del thread non ho mai provato ma farei così

1) fai un metodo che si chiama Sleep(interval: integer) e lo chiami con 10 minuti come parametro (10 * 60 * 1000)
2) all'interno del metodo Sleep:
Codice: [Seleziona]
repeat
   sleep(1000);
   dec(CountDown, 1000);
until AbortSleep or (CountDown <= 0)

se non ho inciampato in qualche castroneria, potrebbe anche andare
Titolo: Re:sleep che si puo interrompere
Inserito da: Stilgar - Dicembre 15, 2012, 03:30:07 pm
Con i thread ancora meglio ...
Fai un wait object/suspend in modo che il thread venga sospeso dal sistema.
Allora scadere del tempo (wait) fai quello che devi fare.
 ;)
Controlla quello che viene messo a disposizione dalla classe thread. Ci sono già molte cose pronte.
O forse sono io che non capisco la tua esigenza... (che è possibilisssssssimo) ;)

Stilgar
PS:
La cosa viene molto bene con Windows... spero abbiano portato anche le features sulle altre piattaforme.
Puoi passarti anche un parametro sui vari timer di windows. Quindi puoi avere il time out pulito o un break da applicazione.
(Mi sono dimenticato di fare questa precisazione :D)
Titolo: Re:sleep che si puo interrompere
Inserito da: xinyiman - Dicembre 17, 2012, 03:56:21 pm
Con i thread ancora meglio ...
Fai un wait object/suspend in modo che il thread venga sospeso dal sistema.
Allora scadere del tempo (wait) fai quello che devi fare.

Come sarebbe sospeso dal sistema?!

Allora ti spiego io temporaneamente (10 min) devo salvare dei dati in un db locale e poi ogni tot (diciamo ogni ora) devo comunicare queste info ad un server remoto. Ora io uso due thread separati e siccome non permetto che il programma venga chiuso (ma permetto di spegnere il sistema solo dal mio programma) devo far si che prima di spegnere il pc devo assicurarmi che i due thread siano spenti al termine della trasmissione periodica se questa è ancora in corso. Mi sono spiegato meglio?! Sai dirmi qualè la soluzione adeguata?!
Titolo: Re:sleep che si puo interrompere
Inserito da: Stilgar - Dicembre 17, 2012, 04:19:40 pm
http://msdn.microsoft.com/en-us/library/02x3daw5.aspx?cs-save-lang=1&cs-lang=cpp#code-snippet-1

;)
L'idea era usare questa API di window... :D
Titolo: Re:sleep che si puo interrompere
Inserito da: nomorelogic - Dicembre 18, 2012, 09:21:16 am
Allora ti spiego io temporaneamente (10 min) devo salvare dei dati in un db locale e poi ogni tot (diciamo ogni ora) devo comunicare queste info ad un server remoto. Ora io uso due thread separati e siccome non permetto che il programma venga chiuso (ma permetto di spegnere il sistema solo dal mio programma) devo far si che prima di spegnere il pc devo assicurarmi che i due thread siano spenti al termine della trasmissione periodica se questa è ancora in corso.

quasi quasi farei così:
farei un form con 2 TTimer e 3 proprietà pubbliche:

quando timer1 o timer2 soll'evano l'evento OnTimer dovrebbero:

quando si vuole spegnere (ServerIsShuttingDown -> TRUE):

poi qualcosa del genere:
Codice: [Seleziona]
repeat
   CanShutDown := (ServerIsShuttingDown) and (not ApplyIsRunning) and (not NotificationIsRunning);
   if not CanShutDown then
      sleep(1000);
until CanShutDown;
Titolo: Re:sleep che si puo interrompere
Inserito da: xinyiman - Dicembre 18, 2012, 03:26:29 pm
riesci a fare un piccolo esempio di quelli banli banali, zipparlo e postarlo?! Così se qualcuno dovesse averne bisogno oltre me potrebbe usufruirne
Titolo: Re:sleep che si puo interrompere
Inserito da: nomorelogic - Dicembre 18, 2012, 03:53:20 pm
ok, ora sono al lavoro ma vedrò di farne uno
Titolo: Re:sleep che si puo interrompere
Inserito da: xinyiman - Dicembre 18, 2012, 03:53:53 pm
Grazie mille
Titolo: Re:sleep che si puo interrompere
Inserito da: nomorelogic - Dicembre 19, 2012, 04:15:34 pm
prova questo:

il bottone "shut down" attiva lo spegnimento del sistema.

gli altri bottoni simulano il termine di un thread (il quale è stato lanciato dal rispettivo timer) impostando il relativo semaforo.

lancia il programmino e aspetta, una volta che i timer hanno attivato sia "apply" che "notifica" puoi cliccare su "shut down" che comunque non terminerà prima della fine dei 2 thread.