【问题标题】:How to change the name of a thread如何更改线程的名称
【发布时间】:2010-10-03 11:51:10
【问题描述】:

我有一个使用“很多”线程的服务器应用程序。不想讨论它真正应该使用多少线程,如果能够在调试器“线程”窗口中看到一些描述性文本来描述每个线程是什么,而不必单击它并根据上下文确定它是什么。

它们都具有相同的起始地址,因此线程窗口通常会显示类似“thread_base::start”或类似的内容。我想知道是否有 API 调用或允许我自定义该文本的东西。

【问题讨论】:

    标签: c++ multithreading winapi


    【解决方案1】:

    【讨论】:

    • 可能值得注意的是,它通过向调试器发送特殊异常来工作;如果在调用 SetThreadName 时调试器未附加到进程,则线程将没有名称。并且没有“GetThreadName”可以补充。如果一个线程应该知道自己的名字,它就需要存储它。
    【解决方案2】:

    这是我使用的代码。

    这在头文件中。

    #pragma once
    
    #define MS_VC_EXCEPTION 0x406d1388
    #pragma warning(disable: 6312)
    #pragma warning(disable: 6322)
    
    typedef struct tagTHREADNAME_INFO
    {
        DWORD dwType;        // must be 0x1000
        LPCSTR szName;       // pointer to name (in same addr space)
        DWORD dwThreadID;    // thread ID (-1 caller thread)
        DWORD dwFlags;       // reserved for future use, most be zero
    } THREADNAME_INFO;
    
    inline
    void SetThreadName(DWORD dwThreadID, LPCSTR szThreadName)
    {
    #ifdef _DEBUG
        THREADNAME_INFO info;
        info.dwType = 0x1000;
        info.szName = szThreadName;
        info.dwThreadID = dwThreadID;
        info.dwFlags = 0;
    
        __try
        {
            RaiseException(MS_VC_EXCEPTION, 0, sizeof(info) / sizeof(DWORD), (DWORD *)&info);
        }
        __except (EXCEPTION_CONTINUE_EXECUTION)
        {
        }
    #else
        dwThreadID;
        szThreadName;
    #endif
    }
    

    然后我在线程过程中这样称呼它。

    SetThreadName(GetCurrentThreadId(), "VideoSource Thread");
    

    值得注意的是,这是 David 发布链接的确切代码(谢谢!我忘记了从哪里得到的)。我没有删除这篇文章,因为如果 MSDN 决定(再次)重新组织其链接,我希望代码仍然可用。

    【讨论】:

    • 出于好奇,您为什么将其设为仅 DEBUG 的东西?
    • 嗯,这不是 确切 版本。 MSDN 版本不会因_DEBUG 而异。使用此代码,如果您在调试器下运行发布版本,线程将没有名称。
    • 我使用名称来识别调试器中的线程。如果我不调试,我不想要开销或可能的附加向量。
    • 您仍然可以将调试器附加到发布版本,在那里您将需要您可以获得的所有帮助
    【解决方案3】:

    Windows 10 添加了SetThreadDescription(),在那个平台上这将是最好的方法。

    【讨论】:

      猜你喜欢
      • 2011-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多