c++ builder XE4, 10.2 Tokyo | TThread > 스레드 이름을 코드로 붙인다 > SetThreadName(L"ThreadTest_tpNormal", threadID);

운영 환경
C++ Builder XE4 on Windows 7 pro
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)

ぃ tp // 이 m / 7 ~ f9 / ms / b 8f229862c5b868699
계속.

TThread 의 Execute() 에 있어서 이하의 처리를 하면 thread의 이름이 붙는 것을 발견했다.

(추기 2016/03/06)
SetThreadName() 는 Indy10에서 제공되는 함수와 같습니다. IdGlobal.pas 에 포함된다.
이 함수를 사용하는 경우, Indy10 관련의 헤더 인클루드가 필요하게 된다. Indy10 관련을 include하면 장래의 이식시에 문제가 나올 것 같다.
그래도 사용하는 경우는, Code Complete의 「Identify Areas Likely to Change」에 근거해, 장래 변경하는 부분을 식별하기 쉽게 해 두는 것이 바람직하다.
#include <IdGlobal.hpp>
...
DWORD tid = GetCurrentThreadId();
SetThreadName(L"ThreadMain", tid);

스레드의 상태는 다음과 같습니다.



IDE의 "명명 된 스레드"기능을 솔직하게 사용하는 것이 편할지도 모르지만, 이전에 "이름 없음"스레드에서 "명명 된"스레드로 변환하려고 시도하는 "매달린"경험이 있으므로 위와 같은 방법 하고있다.

v0.2



thread의 우선도도 기재하면 다른 thread와의 관계성이 명확하게 되어 디버그하기 쉬워진다.
#include <IdGlobal.hpp>
...
DWORD tid = GetCurrentThreadId();
SetThreadName(L"ThreadMain_tpNormal", tid);

v0.3



this->Priority로부터 thread의 우선도를 자동 부가하는 코드를 추가.
static String getThreadPriorityString(TThreadPriority priority)
{
    switch(priority) {
    case tpHigher:
        return L"_Higher";
    case tpNormal:
        return L"_tpNormal";
    case tpLower:
        return L"_tpLower";
    case tpLowest:
        return L"_tpLowest";
    case tpIdle:
        return L"_tpIdle";
    default:
        return L"_tpOther";
    }
}

다음과 같이 사용한다.
#include <IdGlobal.hpp>
...
void __fastcall TThreadMain::Execute()
{
    // スレッド名の表示
    DWORD tid = GetCurrentThreadId();
    String thrnam = L"ThreadMain" + getThreadPriorityString(this->Priority);
    SetThreadName(thrnam, tid);


v0.4



UtilDebugThreadInfo.cpp, .h라는 파일로 스레드 명 부가 처리를 옮겼다.
클래스의 static 함수로 구현.

각각의 TThread에서는 다음과 같이 사용한다.
#include <UtilDebugThreadInfo.h>
...
void __fastcall TThreadMain::Execute()
{
    CUtilDebugThreadInfo::SetDebugInfoThreadName(this->Priority, L"ThreadMain");
        ...

TForm의 경우 Priority라는 속성이 없었기 때문에 FormShow에서 다음과 같이 한다.
tpNormal은 임의의 값입니다.
폼으로 하면, 여러가지 폼을 Show할 때마다, 1개의 thread의 이름이 무렵 바뀌는 것 같다.
    CUtilDebugThreadInfo::SetDebugInfoThreadName(tpNormal, L"TMainForm");

UtilDebugThreadInfo.cpp에 정리해 두는 것으로, 장래의 이식시에 Indy10의 함수 시그니쳐가 변화하거나, Indy10을 사용하지 않게 되었을 경우에도 이 파일의 수정으로 끝난다.
「Identify Areas Likely to Change.」라고 하는 변경(해야 할) 개소의 identify도 하기 쉬워야 한다.

좋은 웹페이지 즐겨찾기