Programma in Esecuzione automatica

di il
5 risposte

Programma in Esecuzione automatica

Salve a tutti.
Ho creato un pò di tempo fa, un programmino VCL messo in esecuzione automatica che si avvia automaticamente e sincronizza 2 DB.
Purtroppo capita che questa applicazione si stacchi o non si avvi, non avviando la sincronizzazione.

Come posso fare in modo che questo non succeda ? devo creare un servizio di windows ? Si deve riscrivere tutta l'applicazione ?
In realtà il massimo sarebbe che l'applicazione poi si chiuda da solo a un certo orario e riparta l'indomani.

5 Risposte

  • Re: Programma in Esecuzione automatica

    La cosa migliore è creare un servizio sempre attivo che operi in base all'ora di sistema
  • Re: Programma in Esecuzione automatica

    Quindi mi consigli di riscrivere l'applicazione...

  • Re: Programma in Esecuzione automatica

    Se funzionava la logica è la stessa, devi solo scrivere la parte relativa alla struttura del servizio e gestione orario per la sua attivazione
  • Re: Programma in Esecuzione automatica

    31/12/2025 - danielito ha scritto:

    Purtroppo capita che questa applicazione si stacchi o non si avvi, non avviando la sincronizzazione.

    Bisognerebbe comprendere le cause all'origine del mancato avvio, o "stacco", di questa applicazione: magari ci sono altre cause.

    31/12/2025 - danielito ha scritto:

    devo creare un servizio di windows ?

    Creare un servizio Windows è senz'altro una delle opzioni più consigliabili, per tanti buoni motivi: puoi configurare il tipo di avvio del servizio, sia dal Service Control Manager (SCM) sia dal Task Scheduler di Windows, puoi attribuire un utente di esecuzione o diritti speciali, e così via. In modo particolare, il servizio non ha bisogno di effettuare il login per poter partire, cosa che non avviene negli altri contesti.

    31/12/2025 - danielito ha scritto:

    Si deve riscrivere tutta l'applicazione ?

    Dipende da come hai scritto l'applicazione. Quelle che faccio io generalmente no, perché ho cura di suddividere la logica di gestione dell'interfaccia visuale da quella "business", ossia quella che fa il lavoro. Infatti, spesso per servizi di questo tipo creo diversi progetti, uno per la business logic principale (sottoforma di package), una Console che faccia da shell per riga di comandi, un servizio Windows (se serve) e il progetto per gli Unit/Integration Test. Dovessi fruire del mio servizio da un'applicazione web, mi basterebbe aggiungere un altro "guscio" a quelli esistenti, configurando i servizi necessari a seconda del contesto. Queste "aggiunte" possono essere utili se ti serve anche comunicare in qualche modo usando una interfaccia utente di qualche tipo e interagire con il servizio, per visualizzarne lo stato o impartire comandi.

    Va da sé che se hai scritto tutto il codice nella Main Form della tua applicazione, questo risulta più arduo da fare e il primo step da seguire è quello di rifattorizzare per avere un'architettura simile a quella che ho descritto sopra, lasciando le applicazioni finali (VCL, Console, Service, ecc.) a fare solo da "involucri", da host per la tua logica, rendendo così anche facile il debug (è senz'altro ostico fare debug su un servizio Windows, mentre è semplicissimo da Console o - ancora meglio! - dai Test).

    Da questo punto di vista, Delphi ti consente di creare nativamente tutte le tipologie di queste applicazioni, pure crossplatform se tu volessi!

    31/12/2025 - danielito ha scritto:

    In realtà il massimo sarebbe che l'applicazione poi si chiuda da solo a un certo orario e riparta l'indomani.

    Per queste necessità, ti puoi interfacciare appunto con il Task Scheduler di Windows per eseguire il tuo servizio a orari specifici, con una gamma abbastanza ampia di opzioni.

  • Re: Programma in Esecuzione automatica

    Se l'applicazione parte "automaticamente" è probabile che la parte visuale sia minima. E parlando di sincronizzazione di DB non è in genere una operazione complessa, quindi il porting come servizio dovrebbe essere comunque semplice.

    Delphi, come accennava @Alka, ti consente molto facilmente di creare servizi per Windows (e non solo).

    Fai attenzione ad una cosa: non devi assolutamente inserire alcunchè di "grafico" o legato alle VCL come componenti visuali nel servizio, per nessun motivo. I servizi di Windows non possono usare nulla di "grafico", ne ovviamente di input / output diretto con l'utente (ad esempio tastiera e mouse).

    Anche un banale "ShowMessage" provocherebbe o il crash del servizio o bene che ti vada non accadrebbe nulla (cioè non visualizzaresti nulla).

    Alcuni componenti che NON devi inserire ad esempio sono TForm, TEdit, TMemo, TShape e neanche i DBAware come TDBEdit o i TDBGrid. Non è consentito l'uso neanche se li istanzi a runtime (ossia non li inserisci a design time).

    Puoi invece usare ciò che non è visuale (in genere) come accesso ai file, record o classi anche complesse come TDictionary, i generici, le RTL e anche i TThread.

    Ricordati che come servizio il tuo applicativo potrebbe "girare" (dipende da come configuri il tutto) senza un aggancio specifico ad un utente, ad esempio come "locale" (LocalSystem, LocalService) e quindi l'ambiente potrebbe non essere quello che ti aspetti (per esempio la directory "Documenti" non è detto che sia quella di un utente, anche se nel PC ne è configurato solo uno ed è quello di default).

    P.S.: attenzione che il servizio, così come una applicazione ad avvio automatico, devono poter avere ciò da cui dipendono a disposizione quando iniziano ad usarlo ... ad esempio nel caso di accesso alla rete ovviamente i servizi di rete devono essere attivi o il servizio / applicazione fallirà. Come consiglio, alla partenza del servizio testa sempre ciò di cui hai bisogno (ad esempio la connessione con i DB) tramite try / except e se fallisce ritenta dopo alcuni minuti. In certe condizioni i servizi base possono impiegare diverso tempo a "partire" e ciò che dipende da questi deve ovviamente "rallentare", pena il crash del servizio / applicazione.

    P.S.2 (e poi termino): Occhio che non hai un HANDLE tipo quello di una Form valido. Un servizio non risponde ne riceve messaggi di Windows legati ad alcunchè al desktop (grafico o altro che sia). Quindi attento che alcuni eventi (legati a componenenti anche non grafiche) potrebbero non essere disponibili nel tuo servizio.

Devi accedere o registrarti per scrivere nel forum
5 risposte