Imagine a seguinte situação: sua empresa solicita um importante processo, que, por apresentar alto custo de execução, deve ser executado a noite ou iniciado no final da tarde e o tempo de execução seja de aproximadamente 8 horas (por exemplo).
Você inicia esse processo, mas, no meio da execução, ele é interrompido. Seu Windows entrou em hibernação após um determinado tempo. Infelizmente todo o seu trabalho acabou atrasando um dia, pois terá que ser executado no dia seguinte.
Esse é um exemplo banal mas que acontece muito no cotidiano dos profissionais de TI. Para não dependermos de configurações externas, podemos utilizar a própria API do Windows, utilizando a função SetThreadExecutionState e tornando o nosso software mais inteligente e evitando assim surpresas desagradáveis!
Vejam a classe desenvolvida abaixo. Através dela, conseguimos proteger qualquer rotina que seja critica enquanto estiver em execução.
unit CriticalProcess;
interface
type
TCriticalProcess = class
protected
procedure Execute(const Value: Boolean); virtual;
public
constructor Create;
destructor Destroy; override;
procedure Stop;
procedure Start;
end;
var
CriticalProcess: TCriticalProcess;
implementation
uses
Windows;
type
EXECUTION_STATE = DWORD;
const
ES_CONTINUOUS = $80000000;
ES_SYSTEM_REQUIRED = $00000001;
procedure SetThreadExecutionState(ESFlags: EXECUTION_STATE); stdcall;
external kernel32 name 'SetThreadExecutionState';
constructor TCriticalProcess.Create;
begin
inherited;
end;
destructor TCriticalProcess.Destroy;
begin
inherited;
end;
procedure TCriticalProcess.Stop;
begin
Execute(False);
end;
procedure TCriticalProcess.Start;
begin
Execute(True);
end;
procedure TCriticalProcess.Execute(const Value: Boolean);
begin
if Value then
SetThreadExecutionState(ES_SYSTEM_REQUIRED or ES_CONTINUOUS)
else
SetThreadExecutionState(ES_CONTINUOUS);
end;
initialization
CriticalProcess := TCriticalProcess.Create;
finalization
CriticalProcess.Free;
end.
Exemplo de utilização da classe:
uses
CriticalProcess;
procedure TfrmExemplo.btnExecutarClick(Sender: TObject);
begin
CriticalProcess.Start;
try
// Coloque aqui todo o processamento crítico.
// Todo o bloco de código inserido aqui estará protegido
// e será executado sem interferências do sistema operacional.
finally
CriticalProcess.Stop;
end;
end;
Toda a documentação sobre o método SetThreadExecutionState é encontrado no site da Microsoft.
Contato