Domanda

Sto facendo un'applicazione Delphi che verrà eseguita sul mio PC 24/7 in background e controllerò se deve fare alcune azioni o meno, attendere 30 minuti e controllare di nuovo e così via.

Come posso assicurarmi che l'applicazione non sovraccaricherà la CPU o la memoria a causa dell'esecuzione sempre.

È stato utile?

Soluzione

La maggior parte dei linguaggi di programmazione ha una funzione di "sonno" che puoi chiamare per far smettere il programma a fare cose.

Hai il controllo dell'utilizzo della memoria; Puoi trattare la tua memoria prima di andare a dormire e riallocarla quando ti svegli, ma ...

Potrebbe essere meglio impostare un lavoro ricorrente. Non so come farlo, ma sospetto che ci sia un modo con Windows Scripting Host per lanciare la tua applicazione su qualsiasi programma tu voglia.

Altri suggerimenti

Creare un Timer Per funzionare ogni 30 minuti e chiamare i tuoi assegni/azioni da lì. Quindi la tua applicazione può semplicemente stare inattiva quando non c'è nulla da fare.

In alternativa, è possibile creare un'attività programmata che funziona periodicamente per farlo.

Le risposte sui timer sono buone soluzioni e aggiungo questo: assicurati che l'evento del timer o la successiva procedura chiamata controlla per occupare. cioè se ti svegli, assicurati che l'ultimo batch sia finito prima di iniziare un nuovo batch. Questo è facile da perdere quando le cose scorrono bene, e poi hai una situazione in cui le cose sono eseguite il backup e l'intero sistema logjams alle 8 del mattino perché è successo qualcosa di brutto a mezzanotte e ora ci sono 16 chiamate impilate (o thread , processi, ecc.).

Quindi scrivi il tuo evento timer in questo modo:

OnMyTimer...
begin
  MyTimer.Enabled := false;
  try
    DoSomethingForALongTime;  // Usually runs in 45 seconds, but sometimes takes 45 minutes!
  finally
    MyTimer.Enabled := true;  // and (SomeAbortRequest = False) and (SomeHorribleErrorCount = 0);  
  end;
end;

Le risposte sui timer sono praticamente esattamente ciò che stai cercando. Per quanto riguarda la tua domanda sul non sovraccaricare la CPU o la memoria, dai un'occhiata al tuo programma nel Task Manager. Quando non fa nulla, dovrebbe sedersi in uno "stato stazionario" di memoria, non allocare più e usare l'1% o meno del tempo della CPU.

È sicuro lasciare la maggior parte dei programmi al minimo per lunghi periodi. Il VCL sa come gestire il minimo senza accumulare risorse CPU per te e devi solo usare un timer per assicurarti che si svegli e attivi il suo evento al momento giusto.

Se vuoi imporre uno stato assoluto di inattività, immagino che potresti usare la funzione "Sleep". Anche se non sono sicuro di come si comporterebbe su un riavvio. (Immagino che Windows segnalerebbe l'applicazione come non rispondente.)

Se l'applicazione non ha una forma principale e si è semplicemente seduta nel vassoio (o essendo totalmente invisibile), non farà molto. Il circuito principale del messaggio gestirà tutto il messaggio che riceve dal sistema operativo, ma non dovrebbe ricevere molti. E i pochi messaggi che riceverà, dovrebbero elaborarli (messaggi di spegnimento, i parametri di sistema modificano la notifica, ecc.)

Quindi, penso che potresti semplicemente impostare un timer e dimenticare di impostare il codice per costringere il tuo programma a rimanere inattivo.

Se vuoi davvero limitare l'attività di processo a un massimo, è possibile impostare la priorità del thread quando si inserisce/lascia l'evento del timer. Quindi imposteresti la priorità su "normale" quando si entra nell'evento e lo imposti su "basso" quando ne uscirà.

Non l'hai detto, ma se la tua applicazione utilizza più di un thread, questo potrebbe aggiungere alla quantità di CPU che il sistema operativo spende sul tuo processo (leggi le fette di tempo e gli interruttori dei thread per esempio).

Il sistema operativo può anche sostituire alcune delle pagine di memoria, utilizzando così meno memoria e/o riducendo l'accesso della memoria anche nel "tempo di attesa" aiuta.

Quindi, se usi solo un thread e non si dispone neanche sugli circuiti di messaggio aggiuntivi, solo chiamare il sonno () potrebbe essere un buon modo, in quanto ciò segnalerà al sistema operativo che non hai bisogno di una fetta di tempo per molto tempo venire.

Evita redyThread ()/switchTothRead () e il tuo mantenimento del tempo (usando ora ()) in quanto ciò significherebbe che si sta svolgendo un sacco di cambio di filo, da fare .... niente!

Un altro metodo potrebbe essere da usare WaitFormultipleObjects Con un timeout di grandi dimensioni, quindi l'applicazione può ancora rispondere ai messaggi.

Suggerirei di creare un'applicazione di servizio (impostare il tipo di avvio come automatico) e utilizzare createtimerqueuetimer come timer. Le perdite di memoria possono essere mitigate riservendo i requisiti di memoria/le classi di pool.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top