멀티 쓰레드 환경에서 Break point를 잡고 디버깅 하다보면 불편한 것 중에 하나가 디버깅 데스크탑에 나오는 Thread Status 탭에 쓰레드 ID 만 나와서 구분하기 힘들다는 것입니다. 여기에 보면 Main 쓰레드의 경우는 Main 하고 나오지요.
이걸 어떻게하는 걸까 하고 뒤져봤다니 Indy에 이런 기능이 IdGlobal.pas에 SetThreadName이라는 프러시저로 지원하네요. 코드 내용을 보니 MS에서 자기들 디버깅용으로 사용하려고 만들어 놓은것 같네요.
사용 방법은 쓰레드의 Execute 프러시저 안에서 호출하면 됩니다. 함수 내용을 보면 알겠지만, 현재 쓰레드의 이름을 설정하기 때문에 거기서만 가능합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
procedure SetThreadName(const AName: AnsiString); type TThreadNameInfo = record RecType: LongWord; // Must be 0x1000 Name: PChar; // Pointer to name (in user address space) ThreadID: LongWord; // Thread ID (-1 indicates caller thread) Flags: LongWord; // Reserved for future use. Must be zero end; var LThreadNameInfo: TThreadNameInfo; begin with LThreadNameInfo do begin RecType := $1000; Name := PChar(AName); ThreadID := $FFFFFFFF; Flags := 0; end; try // This is a wierdo Windows way to pass the info in RaiseException($406D1388, 0, SizeOf(LThreadNameInfo) div SizeOf(LongWord), PDWord(@LThreadNameInfo)); except end; end; |
TThread의 Helper로 작성한다면
1 2 3 4 |
TThreadHelper = class helper TThread protected procedure SetName(const AName: AnsiString); end; |
이렇게 하고 Execute에서는
1 2 3 4 5 6 |
procedure TMyThread.Execute; begin SetName(ClassName); blabla.... end; |
— 출처 : 볼랜드 포럼 : 작성자 : DrK (whitekid) —
최신 댓글