Pregunta

Estoy haciendo una aplicación Delphi que se ejecutará en mi PC 24/7 en segundo plano y verificará si tiene que hacer algunas acciones o no, espere 30 minutos y verifique nuevamente, y así sucesivamente.

¿Cómo puedo asegurarme de que la aplicación no sobrecarga la CPU o la memoria debido a que se ejecuta todo el tiempo?

¿Fue útil?

Solución

La mayoría de los lenguajes de programación tienen una función de "sueño" que puede llamar para que el programa deje de hacer cosas.

Usted tiene el control del uso de la memoria; Puede repartir su memoria antes de irse a dormir y reasignarla cuando se despierta, pero ...

Puede ser mejor configurar un trabajo recurrente. No sé cómo hacer esto, pero sospecho que hay una manera con Windows Scripting Host para lanzar su aplicación en cualquier horario que desee.

Otros consejos

Crear un Temporizador para ejecutar cada 30 minutos y llame a sus cheques/acciones desde allí. Entonces su aplicación puede quedarse inactiva cuando no hay nada que hacer.

Alternativamente, podría crear una tarea programada que se ejecute periódicamente para hacer esto.

Las respuestas sobre los temporizadores son buenas soluciones, y agrego esto: asegúrese de que el evento del temporizador o el procedimiento posterior llamado, verifica la concurrida. es decir, si te despiertas, asegúrate de que el último lote esté hecho antes de comenzar un nuevo lote. Esto es fácil de perder cuando las cosas fluyen bien, y luego tiene una situación en la que las cosas están respaldadas y todo el sistema se registra a las 8 de la mañana porque algo malo sucedió a la medianoche y ahora hay 16 llamadas apiladas (o hilos , procesos, etc.).

Así que escribe tu evento de temporizador así:

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;

Las respuestas sobre los temporizadores son casi exactamente lo que estás buscando. En cuanto a su pregunta sobre no sobrecargar la CPU o la memoria, eche un vistazo a su programa en el Administrador de tareas. Cuando no está haciendo nada, debe sentarse en un "estado estable" de la memoria, no asignar más y usar 1% o menos de tiempo de CPU.

Es seguro dejar que la mayoría de los programas sean inactivos durante largos períodos. El VCL sabe cómo manejar el ralentí sin acaparar los recursos de CPU para usted, y solo necesita usar un temporizador para asegurarse de que se despierta y active su evento en el momento adecuado.

Si desea hacer cumplir un estado absoluto de inactividad, supongo que podría usar la función de "dormir". Aunque no estoy seguro de cómo se comportaría en un reinicio. (Supongo que Windows informaría que la aplicación no responde).

Si la aplicación no tiene forma principal y simplemente sentada en la bandeja (o es totalmente invisible), no hará mucho. El bucle principal del mensaje manejará todo el mensaje que recibe del sistema operativo, pero no debería recibir muchos. Y los pocos mensajes que recibirá, debe procesarlos (mensajes de cierre, parámetros del sistema cambian de notificación, etc.)

Entonces, creo que podría configurar un temporizador y olvidarse de configurar el código para obligar a su programa a permanecer inactivo.

Si realmente desea limitar esa actividad del proceso al máximo, puede establecer la prioridad del subproceso cuando ingrese/deje el evento del temporizador. Por lo tanto, establecería la prioridad en "Normal" cuando ingrese al evento y la configuraría en "Bajo" al salir de él.

No lo dijo, pero si su aplicación usa más de un hilo, esto podría agregar a la cantidad de CPU que el SO gasta en su proceso (lea las rodajas de tiempo y los interruptores de subprocesos, por ejemplo).

El sistema operativo también puede intercambiar algunas de sus páginas de memoria, así que también ayuda a ayudar a menos memoria y/o reducir los acceso de memoria en el "tiempo de espera".

Por lo tanto, si usa solo un hilo y tampoco tiene avances de mensaje adicionales, solo llamar a dormir () podría ser una buena manera, ya que eso le indicará al sistema operativo que no necesita una porción de tiempo durante mucho tiempo para venir.

Evite el therothread ()/switchTothRead () y su propio tiempo de mantenimiento (usando ahora () por ejemplo), ya que eso significaría que se está produciendo un montón de subprocesos, para hacer ... ¡nada!

Otro método podría ser usar WaitFormultipleObjects Con un gran tiempo de espera, por lo que su aplicación aún puede responder a los mensajes.

Sugeriría crear una aplicación de servicio (Establezca el tipo de inicio como automático) y use CreateTimerqueUetimer como su temporizador. Las filtraciones de memoria se pueden mitigar la reserva de requisitos de memoria/clases de agrupación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top