6 maneiras de fazer a mesma coisa, o que é considerado boas práticas?

As vezes tem tantas maneiras diferentes de fazer o mesmo código que nós ficamos na dúvida quanto a qual maneira usar. O que seria considerado "boa prática" pela comunidade e o que sua equipe entenderia melhor. Suponhamos que você esteja trabalhando dentro de um método de um Domain Service chamado UmDomainServiceChique(objetoDoDominio) que será chamado por uma API. Você tem uma regra de negócio chique para ser verificada que por enquanto chamarei de VerificaMinhaRegraChiqueComplexa(). Você chama UmDomainServiceChique(objetoDoDominio) e caso VerificaMinhaRegraChiqueComplexa() retorne true você vai querer que UmDomainServiceChique faça o que tem que fazer e a api retornar Ok 200, caso contrário você quer que a API responda um erro qualquer, tipo BadRequest, e retornar uma mensagem dizendo que VerificaMinhaRegraChiqueComplexa deu ruim. Eu vejo 6 maneiras de fazer isso, gostaria de saber a opinião de outrs devs sobre qual seria a maneira menos gambiarr...

Como "matar" um processo no Delphi

Para fechar um programa executável pelo seu nome crie a seguinte função:


function killtask(ExeFileName: string): Integer;
const
  PROCESS_TERMINATE = $0001;
var
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
begin
  Result := 0;
  FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
  ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);

  while Integer(ContinueLoop) <> 0 do
  begin 
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
      UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =
      UpperCase(ExeFileName))) then 
      Result := Integer(TerminateProcess(
                        OpenProcess(PROCESS_TERMINATE,
                                    BOOL(0),
                                    FProcessEntry32.th32ProcessID),
                                    0));
     ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
  end;
  CloseHandle(FSnapshotHandle);
end;


E use-a assim:

killtask('notepad.exe');

Essa foi uma "dica expressa" só código, sem mais delongas.

Até a próxima ;)

Comentários

  1. Mas esta função ai ela pega todos os processos com o nome do exe passado ?

    E o retorno dela como funciona ?

    Desde já grato

    ResponderExcluir
  2. A idéia é matar todos os processos com o mesmo nome de exe.
    Agora se você comentar a linha
    ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);

    e substituir por ContinueLoop := false;

    ele mata só o primeiro processo encontrado (em ordem de ID se não me engano)

    ResponderExcluir
  3. ae sabe pausa processo naum ?pausa e despausa

    ResponderExcluir
  4. excelente ... funciono perfeitamente, gostei muito me procura no face la ;)


    https://www.facebook.com/rafael.almeida.50767?ref=tn_tnmn

    ResponderExcluir
  5. Excelente Post... Obrigado por compartilhar!

    ResponderExcluir
  6. Olá.

    Gotaria de saber se onde tem: (ExeFileName) ou (ExeFile), devo colocar pode exemplo: Notepad.exe ou seria apenas Notepad, sendo notepad um processo do windows..

    ResponderExcluir
  7. Olá, saberia dizer se esse código libera a memória da aplicação finalizada?

    ResponderExcluir
  8. Acredito que ele libera a memória. Para ter certeza monitore o uso da memória com o process Explorer ou o task manager.

    Pesquise no msdn pela documentação da api openprocess passando o valor 1 no primeiro argumento. O valor 1 é terminar o processo.

    ResponderExcluir

Postar um comentário

Postagens mais visitadas deste blog

Botão Add This para adicionar seu post em qualquer rede

Busca de CEP com o Lazarus - Parte 1 - UrlEncode

Uso de memória no SQL Server