Quando exatamente um programa do Windows faz uma pausa?

6

Eu tenho um aplicativo que precisa ser executado por um longo período sem supervisão no Windows XP e 7. Eu o tenho executado em uma máquina remota que tenha o LogMeIn instalado para que eu possa vê-lo de longe. O programa tem tarefas regulares de registro que são estimuladas por timers.

Eu tinha notado que se o PC fosse configurado para salvar a tela após um atraso e apresentar a tela de login do usuário ao sair do protetor de tela, meu aplicativo pararia de funcionar quando o computador entrasse em proteção de tela.

Quando eu faço o login remotamente e faço o kickout do protetor de tela, ele continua de onde parou, mas não há dados registrados no período intermediário.

Eu pensei que tinha resolvido isso desmarcando a opção "no currículo, mostrar tela de boas-vindas" nas opções de proteção de tela, mas o problema parece estar de volta. Eu tentei desativar o screensaver completamente - sem sorte.

Como posso ter certeza de que meu programa continua funcionando o tempo todo? Eu sei que na tela de boas-vindas o Windows me diz que tenho "x programas em execução", mas isso não se estende ao Windows temporizadores, pelo menos algum tempo.

Mais informações:

Adicionei um código de depuração e tenho um pouco mais de informação.

O aplicativo é um aplicativo GUI Delphi 2006. Uma das tarefas regulares que ele faz é gerar um relatório. Enquanto o relatório está sendo gerado (pode levar algum tempo) eu mostro uma barra de progresso. Isso é implementado como um formato modal no qual todo o processamento ocorre em um manipulador OnPaint .

Descobri que, se o relatório for acionado depois que a proteção de tela tiver sido ativada e a caixa de seleção "no currículo, mostrar tela de boas-vindas" estiver marcada, o método OnPaint desse formato modal nunca será disparado. O evento OnShow do formulário é disparado e o aplicativo é interrompido. Assim que sairmos do protetor de tela e retomarmos, o evento OnPaint será executado e tudo acontecerá.

Minha suposição original de que os eventos do timer não estavam disparando enquanto o protetor de tela estava ativo estava errada. Na verdade, outro código para impedir a reentrada do evento do timer estava impedindo que nada acontecesse até que o relatório fosse concluído, e o relatório foi roubado no evento OnPaint .

Alguma sugestão sobre como implementar este formulário de progresso de forma que ele seja executado quando o computador tiver sido salvo na tela de boas-vindas?

    
por rossmcm 18.09.2011 / 13:46

4 respostas

4

Você pode configurar seu programa para ser executado como um serviço. Desta forma, está sempre a correr em segundo plano.
Dessa forma, você poderia bloquear o sistema e seu aplicativo ainda seria executado.
A ferramenta gratuita Servify This atenderá perfeitamente às suas necessidades.

Download Servify

    
por 18.09.2011 / 15:28
2

Você não tem dados suficientes na sua pergunta para essa linha de pensamento,
então, começo com algumas suposições que você pode afirmar primeiro para ler mais a resposta.

  1. Você está usando um login de domínio de algum tipo na máquina de destino?
  2. O protetor de tela geralmente começa quando o sistema é bloqueado
  3. Em algumas configurações, um login de usuário é perdido enquanto o sistema está bloqueado. (Não consigo me lembrar dos conceitos exatos aqui, mas talvez isso aconteça se você fez login remotamente)
    Em suma, a sessão pode ser terminada ...
  4. Finalmente, se o seu programa precisa de conectividade de rede (ou recursos permitidos apenas para o seu login), esses acessos podem ser revogados quando a sessão é encerrada.
    Isso deixaria o aplicativo incapaz de concluir em tais condições.

Portanto, se esse for o seu caso, o aplicativo não poderá concluir sua atividade devido ao acesso revogado (quando sua sessão terminar) e quando você fizer login novamente para 'desbloquear' o sistema, a sessão será reiniciada e você poderá reiniciar o sistema. aplicação também (que pode ter expirado e parou sem atingir resultados). No entanto, ele inicia normalmente novamente, já que você tem uma nova sessão em execução agora (mas isso resultaria no mesmo problema que você deixa em execução - eventualmente causando uma finalização de sessão e um bloqueio de tela).

    
por 18.09.2011 / 15:17
0

Eu sei que isso pode soar como uma solução mais hackeada, mas você não poderia simplesmente adicionar um pouco de código para mexer o mouse a cada dois minutos? Nada maior, basta adicionar 1, subtrair 1 à posição atual do mouse em qualquer eixo.

    
por 21.09.2011 / 00:40
0

A solução final que tive de adotar foi fazer o processamento no manipulador FormActivate . Eu tive que fechar o formulário postando uma mensagem, pois o método Close não funciona até que o manipulador OnPaint seja chamado. Ao contrário do evento OnPaint , o evento OnActivate é chamado quando o PC está no protetor de tela.

procedure TReportForm.FormShow (Sender: TObject) ;
begin
OnActivate := FormActivate ;      // reinstate the handler (it will be nil from any prior call)
end;

procedure TReportForm.FormActivate (Sender: TObject) ;
begin
OnActivate := nil ;               // prevent it being called recursively
GenerateReport ;
PostMessage (Handle, WM_CLOSE, 0, 0) ;
end ;
    
por 12.10.2011 / 22:19