quinta-feira, 18 de fevereiro de 2010

Nomeação de Thread

Quando se trabalha com programação multi-thread é bem complicado depurar.

A nomeação de uma thread ajuda, como na figura abaixo:



Essa tarefa no Delphi 2010 ficou facilitada. No método Execute da sua thread, coloque a seguinte linha de código:

procedure TAVFinder.Execute;
begin
inherited;
{$IFDEF VER210}
Self.NameThreadForDebugging(Self.ClassName);
{$ENDIF}
IdentificarPID(Self.ClassName,3);
Self.ProcessarMAP;
_GerarLog(GetCurrentThreadId,Now,sArquivoLog,ctLOGInformation,rlHigh,14,Format('Arquivo MAP - Existe: [%s] Path: [%s] Tempo Processamento: [%s]',[BooleanToString(Self.FExiste,'SIM','NÃO'),Self.FArquivoMAP,Self.FTempoProcessamento]));
while not (Self.Terminated) do
begin
Sleep(10);
end;
end;


Justo?

Um comentário:

Thiago disse...

Pra quem interessar, existe uma forma de, nos Delphi anteriores ao 2010, fazer o mesmo.
É só implementar o método abaixo:

// Set the thread name to the debugger
procedure SetDebbugerThreadName(const AName: string);
type
  TThreadNameInfo = record
    FType: LongWord;     // Must be 0x1000
    FName: PChar;        // Pointer to name (in user address space)
    FThreadID: LongWord; // Thread ID (-1 indicates caller thread)
    FFlags: LongWord;    // Reserved for future use, must be zero
  end;
var
  threadNameInfo: TThreadNameInfo;
begin
  threadNameInfo.FType := $1000;
  threadNameInfo.FName := PChar(AName);
  threadNameInfo.FThreadID := $FFFFFFFF;
  threadNameInfo.FFlags := 0;

  try
    RaiseException($406D1388, 0, SizeOf(threadNameInfo) div SizeOf(LongWord), @threadNameInfo);
  except
  end;
end;

Minha lista de blogs