Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 팁&트릭
Delphi Programming Tip&Tricks
[246] 디버그에 보기 쉽게 Thread 이름 설정하기...
DrK [whitekid] 8178 읽음    2008-05-17 10:33
멀티 쓰레드 환경에서 Break point를 잡고 디버깅 하다보면 불편한 것 중에 하나가 디버깅 데스크탑에 나오는 Thread Status 탭에 쓰레드 ID 만 나와서 구분하기 힘들다는 것입니다. 여기에 보면 Main 쓰레드의 경우는 Main 하고 나오지요.



이걸 어떻게하는 걸까 하고 뒤져봤다니 Indy에 이런 기능이 IdGlobal.pas에 SetThreadName이라는 프러시저로 지원하네요. 코드 내용을 보니 MS에서 자기들 디버깅용으로 사용하려고 만들어 놓은것 같네요.

사용 방법은 쓰레드의 Execute 프러시저 안에서 호출하면 됩니다. 함수 내용을 보면 알겠지만, 현재 쓰레드의 이름을 설정하기 때문에 거기서만 가능합니다.

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로 작성한다면

TThreadHelper = class helper TThread
  protected
    procedure SetName(const AName: AnsiString);
end;

이렇게 하고 Execute에서는

procedure TMyThread.Execute;
begin
   SetName(ClassName);

   blabla....
end;
GomSun2 [vhrvnd723]   2008-05-19 09:10 X
우왕 좋은팁 감사합니다.
Lyn [tohnokanna]   2008-05-19 11:59 X
와우 이거 제 사이트에 가져가도 될까요
DrK [whitekid]   2008-05-19 16:05 X
Lyn/ 좋은 팁은 널리 퍼지는건 좋죠.. 출처는 볼포 하시구요. :D
곽효근 [hggwak]   2008-07-03 14:56 X
와~ 좋은팁 감사합니다
변영희 [trueeyes]   2008-10-21 23:34 X
오.. 왕 좋은 팁...
박지훈.임프 [cbuilder]   2009-10-21 00:36 X
델파이 2010 버전에서는 TThread의 기본 기능으로 포함되었습니다.

TThread.NameThreadForDebugging() 메소드가 그 역할을 하죠.
인자가 두개인데, 첫번째 인자는 지정할 쓰레드 이름, 두번째 인자는 쓰레드ID입니다.
(쓰레드 클래스 안에서 호출할 경우 두번째 인자는 자신의 쓰레드ID를 가리키는 디폴트 인자이므로 안넘겨도 됩니다.)

+ -

관련 글 리스트
246 디버그에 보기 쉽게 Thread 이름 설정하기... DrK 8178 2008/05/17
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.