Pergunta

Estou fazendo um aplicativo Delphi que será executado no meu PC 24/7 em segundo plano e verificarei se ele precisa fazer algumas ações ou não, aguarde 30 minutos e verifique novamente e assim por diante.

Como posso garantir que o aplicativo não sobrecarregue a CPU ou a memória por causa de estar em execução o tempo todo.

Foi útil?

Solução

A maioria das linguagens de programação tem uma função de "sono" que você pode ligar para fazer o programa parar de fazer coisas.

Você está no controle do uso da memória; Você pode negociar sua memória antes de dormir e realocá -la quando estiver acordado, mas ...

Pode ser melhor apenas configurar algum trabalho recorrente. Não sei como fazer isso, mas suspeito que exista um jeito com o host de script do Windows para apenas iniciar seu aplicativo em qualquer programação que desejar.

Outras dicas

Crie um cronômetro Para executar a cada 30 minutos, e ligue seus cheques/ações a partir daí. Então seu aplicativo pode ficar ocioso quando não há nada para fazer.

Como alternativa, você pode criar uma tarefa programada que apenas execute periodicamente para fazer isso.

As respostas sobre os temporizadores são boas soluções, e eu acrescento: verifique se o evento do timer ou procedimento subsequente chamado, cheques para ocupado. ou seja, se você acordar, verifique se o último lote é feito antes de iniciar um novo lote. Isso é fácil de perder quando as coisas estão fluindo bem, e então você tem uma situação em que as coisas são apoiadas e todo o sistema logjanha às 8 da manhã porque algo ruim aconteceu à meia -noite e agora existem 16 chamadas empilhadas (ou tópicos , processos, etc.).

Então, escreva seu evento de timer como este:

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;

As respostas sobre os temporizadores são exatamente o que você está procurando. Quanto à sua pergunta sobre não sobrecarregar a CPU ou a memória, dê uma olhada no seu programa no gerenciador de tarefas. Quando não está fazendo nada, deve sentar -se em um "estado estacionário" de memória, não alocar mais e usar 1% ou menos do tempo da CPU.

É seguro deixar a maioria dos programas ociosos por longos períodos. O VCL sabe como lidar com a marcha lenta sem monogro para você, e você só precisa usar um cronômetro para garantir que ele acorde e ativa seu evento no momento certo.

Se você deseja aplicar um estado absoluto de inatividade, acho que você pode usar a função "sono". Embora eu não tenha certeza de como isso se comportaria em uma reinicialização. (Acho que o Windows relataria o aplicativo como sem resposta.)

Se o aplicativo não tiver uma forma principal e apenas sentar na bandeja (ou ser totalmente invisível), não fará muito. O loop de mensagem principal lidará com toda a mensagem que recebe do sistema operacional, mas não deve receber muitos. E as poucas mensagens que receberão, deve processá -las (mensagens de desligamento, parâmetros do sistema alteram a notificação, etc.)

Então, acho que você poderia simplesmente configurar um cronômetro e esquecer o código de código para forçar seu programa a permanecer ocioso.

Se você realmente deseja limitar a atividade do processo ao máximo, poderá definir a prioridade do thread ao entrar/deixar o evento do timer. Então, você definiria a prioridade como "normal" quando entra no evento e o definia como "baixo" ao sair dele.

Você não contou, mas se o seu aplicativo usar mais de um thread, isso poderá adicionar à quantidade de CPU que o sistema operacional gasta no seu processo (leia em fatias de tempo e trocas de rosca, por exemplo).

O sistema operacional também pode trocar algumas de suas páginas de memória, usando menos memória e/ou reduzindo acessos de memória no "tempo de espera" também ajuda.

Portanto, se você usar apenas um tópico e também não tiver loops de mensagem adicionais, apenas chamar o sono () pode ser um bom caminho, pois isso sinalizará o sistema operacional que você não precisa de um tempo de tempo por um longo tempo para venha.

Evite o rendethread ()/switchTothread () e sua própria manutenção de tempo (usando agora () por exemplo), pois isso significaria que muita troca de rosca está ocorrendo, para fazer .... nada!

Outro método poderia ser usar WaitFormultiLeObjects Com um grande tempo limite, para que seu aplicativo ainda possa responder às mensagens.

Eu sugeriria a criação de um aplicativo de serviço (defina o tipo de inicialização como automático) e use CreateTimerQueuetimer como seu temporizador. Os vazamentos de memória podem ser atenuados reservando os requisitos de memória/agrupamento de classes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top