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:
- inizializzi una proprietà CountDown al valore del parametro interval
- inizializzi una proprietà pubblica AbortSleep a FALSE
- imposti un loop repeat ... until tipo
repeat
sleep(1000);
dec(CountDown, 1000);
until AbortSleep or (CountDown <= 0)
se non ho inciampato in qualche castroneria, potrebbe anche andare
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:
- property ApplyIsRunning: boolean read FApplyIsRunning... // semaforo timer 1
- property NotificationIsRunning: boolean read FApplyIsRunning... // semaforo timer 2
- property ServerIsShuttingDown: boolean // semaforo inibizione timers
quando timer1 o timer2 soll'evano l'evento OnTimer dovrebbero:
- controllare che ServerIsShuttingDown sia FALSE
- impostare il rispettivo semaforo (ApplyIsRunning | NotificationIsRunning) a TRUE
- fare il loro lavoro
- impostare il rispettivo semaforo (ApplyIsRunning | NotificationIsRunning) a FALSE
quando si vuole spegnere (ServerIsShuttingDown -> TRUE):
- si imposta FServerIsShuttingDown a TRUE
poi qualcosa del genere:
repeat
CanShutDown := (ServerIsShuttingDown) and (not ApplyIsRunning) and (not NotificationIsRunning);
if not CanShutDown then
sleep(1000);
until CanShutDown;