Question

Je fais une application Delphi qui s'exécutera sur mon PC 24/7 en arrière-plan et vérifiera s'il doit faire des actions ou non, attendez 30 minutes et vérifiez à nouveau, etc.

Comment puis-je m'assurer que l'application ne surcharger pas le processeur ou la mémoire en raison de l'exécution tout le temps.

Était-ce utile?

La solution

La plupart des langages de programmation ont une fonction "de sommeil" que vous pouvez appeler pour faire en sorte que le programme arrête de faire des choses.

Vous contrôlez l'utilisation de la mémoire; Vous pouvez traiter votre mémoire avant d'aller dormir et de le réaffecter lorsque vous êtes éveillé, mais ...

Il serait peut-être préférable de simplement créer un emploi récurrent. Je ne sais pas comment faire cela, mais je soupçonne qu'il existe un moyen avec l'hôte de script Windows pour lancer simplement votre application sur le calendrier que vous voulez.

Autres conseils

Créer un minuteur Pour courir toutes les 30 minutes et appeler vos chèques / actions à partir de là. Ensuite, votre application peut simplement rester inactive lorsqu'il n'y a rien à faire.

Alternativement, vous pouvez créer une tâche planifiée qui s'exécute périodiquement pour ce faire.

Les réponses sur les minuteries sont de bonnes solutions, et j'ajoute ceci: assurez-vous que l'événement de temporisation, ou la procédure ultérieure appelée, vérifie le bien occupé. c'est-à-dire que si vous vous réveillez, assurez-vous que le dernier lot est effectué avant de démarrer un nouveau lot. C'est facile à manquer lorsque les choses coulent bien, puis vous avez une situation où les choses sont sauvegardées et l'ensemble du système Logjams à 8 heures du matin parce que quelque chose de mal s'est produit à minuit et maintenant il y a maintenant 16 appels empilés (ou Threads , processus, etc.).

Alors écrivez votre événement de minuterie comme ceci:

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;

Les réponses sur les minuteries sont à peu près exactement ce que vous recherchez. Quant à votre question sur le fait de ne pas surcharger le CPU ou la mémoire, jetez un œil à votre programme dans le gestionnaire de tâches. Lorsqu'il ne fait rien, il doit s'asseoir à un "état d'équilibre" de mémoire, ne plus allouer et utiliser 1% ou moins de temps de processeur.

Il est sûr de laisser la plupart des programmes inactifs pendant de longues périodes. Le VCL sait comment gérer le ralenti sans salir les ressources CPU pour vous, et il vous suffit d'utiliser une minuterie pour vous assurer qu'elle se réveille et active son événement au bon moment.

Si vous souhaitez appliquer un état absolu d'inactivité, je suppose que vous pourriez utiliser la fonction "Sleep". Bien que je ne sache pas comment cela se comporterait sur un redémarrage. (Je suppose que Windows rapporterait que l'application ne répondait pas.)

Si l'application n'a pas de forme principale et est simplement assise dans le plateau (ou étant totalement invisible), elle ne fera pas grand-chose. La boucle de message principale gérera tous les messages qu'il reçoit du système d'exploitation, mais il ne devrait pas en recevoir beaucoup. Et les quelques message qu'il recevra, il devrait les traiter (messages d'arrêt, paramètres du système Changement de notification, etc.)

Donc, je pense que vous pouvez simplement configurer une minuterie et oublier la définition du code pour forcer votre programme à rester inactif.

Si vous souhaitez vraiment limiter cette activité de processus à un maximum, vous pouvez définir la priorité du thread lorsque vous entrez / quittez l'événement de la minuterie. Vous définissez donc la priorité sur "Normal" lorsque vous entrez l'événement et le définissez sur "Low" lorsque vous en sortez.

Vous ne l'avez pas dit, mais si votre application utilise plus d'un thread, cela pourrait ajouter à la quantité de CPU que le système d'exploitation dépense sur votre processus (lisez les tranches de temps et les interrupteurs par exemple).

Le système d'exploitation peut également échanger certaines de vos pages de mémoire, donc en utilisant moins de mémoire et / ou en réduisant les accès de mémoire dans le "temps d'attente", aide également.

Donc, si vous n'utilisez qu'un seul thread et que vous n'avez pas non plus de boucles de message supplémentaires, simplement appeler Sleep () pourrait être un bon moyen, car cela signalera au système d'exploitation que vous n'avez pas besoin d'une tranche de temps pendant longtemps pour viens.

Évitez le rendudthread () / switchtothRead () et votre propre tenue temporelle (en utilisant maintenant () par exemple) car cela signifierait que beaucoup de changements de fil se déroulent, pour faire ... rien!

Une autre méthode pourrait être à utiliser Waitformultipleobjects Avec un grand délai d'attente, votre demande peut toujours répondre aux messages.

Je suggère de créer une application de service (définir le type de démarrage comme automatique) et utiliser CreateTimerqueUetimer comme temporisateur. Les fuites de mémoire peuvent être atténuées en réservant les exigences de mémoire / les classes de mise en commun.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top