Executando um processo com segurança no Windows

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!  :lol:

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.

Deixe um Comentário

O seu endereço de email não será publicado Campos obrigatórios são marcados *

*

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>