当前位置:  开发笔记 > 编程语言 > 正文

如何更改线程的名称

如何解决《如何更改线程的名称》经验,为你挑选了2个好方法。

我有一个使用"很多"线程的服务器应用程序.如果不想进入有关它应该使用多少线程的争论,那么能够在调试器"线程"窗口中看到描述每个线程的一些描述性文本,而不必点击它,从上下文确定它是什么.

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



1> Jere.Jones..:

这是我使用的代码.

这是一个头文件.

#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
}

然后我在线程proc中调用它.

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

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



2> David Norman..:

使用SetThreadName


可能值得注意的是,它通过向调试器发送特殊异常来工作; 如果在调用SetThreadName时调试器未附加到进程,则该线程将没有名称.而且没有"GetThreadName"可以补充.如果一个线程应该知道它自己的名字,它需要存储它.
推荐阅读
U友50081205_653
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有