给线程取名
来源:互联网 发布:淘宝等级如何查询 编辑:程序博客网 时间:2024/05/17 01:18
有的时候,为了调试方便,快速定位问题,我们会为线程取名。由于程序比较简单,我直接贴代码:
#include <iostream>
#include <process.h>
using namespace std;
const DWORD kVCThreadNameException = 0x406D1388;
typedef struct tagTHREADNAME_INFO {
DWORD dwType; // Must be 0x1000.
LPCSTR szName; // Pointer to name (in user addr space).
DWORD dwThreadID; // Thread ID (-1=caller thread).
DWORD dwFlags; // Reserved for future use, must be zero.
} THREADNAME_INFO;
typedef struct tagTHREADNAME_INFO {
DWORD dwType; // Must be 0x1000.
LPCSTR szName; // Pointer to name (in user addr space).
DWORD dwThreadID; // Thread ID (-1=caller thread).
DWORD dwFlags; // Reserved for future use, must be zero.
} THREADNAME_INFO;
void SetThreadName(DWORD thread_id, const char* name) {
// The debugger needs to be around to catch the name in the exception. If
// there isn't a debugger, we are just needlessly throwing an exception.
if (!::IsDebuggerPresent())
return;
THREADNAME_INFO info;
info.dwType = 0x1000;
info.szName = name;
info.dwThreadID = thread_id;
info.dwFlags = 0;
info.dwType = 0x1000;
info.szName = name;
info.dwThreadID = thread_id;
info.dwFlags = 0;
__try {
RaiseException(kVCThreadNameException, 0, sizeof(info) / sizeof(DWORD),
reinterpret_cast<DWORD_PTR*>(&info));
}
__except (EXCEPTION_CONTINUE_EXECUTION) {
}
}
RaiseException(kVCThreadNameException, 0, sizeof(info) / sizeof(DWORD),
reinterpret_cast<DWORD_PTR*>(&info));
}
__except (EXCEPTION_CONTINUE_EXECUTION) {
}
}
unsigned __stdcall SecondThreadFunc(void* pArguments) {
for (int i = 0; i < 100; i++) {
cout << "线程打印\n";
Sleep(1000);
}
_endthread();
return 1;
}
for (int i = 0; i < 100; i++) {
cout << "线程打印\n";
Sleep(1000);
}
_endthread();
return 1;
}
void Func() {
unsigned thread_id;
HANDLE handle_thread = (HANDLE)_beginthreadex(0, 0, &SecondThreadFunc, nullptr, 0, &thread_id);
SetThreadName(thread_id, "thread22222");
WaitForSingleObject(handle_thread, INFINITE);
cout << "线程结束\n";
CloseHandle(handle_thread);
}
unsigned thread_id;
HANDLE handle_thread = (HANDLE)_beginthreadex(0, 0, &SecondThreadFunc, nullptr, 0, &thread_id);
SetThreadName(thread_id, "thread22222");
WaitForSingleObject(handle_thread, INFINITE);
cout << "线程结束\n";
CloseHandle(handle_thread);
}
int main(int argc, TCHAR * argv[]) {
Func();
return 0;
}
return 0;
}
运行程序,查看线程,很容易就会看到自己创建的线程
1 0
- 给线程取名
- 给儿子取名“顾楚涵”
- 给宝宝取名须知!
- 创业者给公司取名
- 程序员夫妻给孩子取名
- 马年生辰八字给孩子取名
- 取名
- 取名
- 给公司取名的一些原则
- 如何给宝宝取名才合适
- 利用喜欢的字给小孩取名
- 平淡生活:给女宝宝取名的学问
- 微软为什么给操作系统取名叫Windows 7
- 按生辰八字给宝宝取名的方法步骤
- 按生辰八字给马宝宝取名的注意事项
- 企业宣传片需要取名吗?如何给企业宣传片命名
- 全集取名
- 取名轶事
- c++ 实现A* 算法
- iOS 多线程 锁 互斥 同步
- github使用教程-转载
- codevs1041
- 【BLE】CC2541之连接参数
- 给线程取名
- 同义词挖掘的一些常用方法
- [二分、贪心]Codeforces Round #307 (Div. 2) C.GukiZ hates Boxes
- 用linked list实现binary-search-tree及其inorderwalk(中序遍历)
- IOS .pch 文件详解
- 整理文件比较的Shell脚本
- POJ 2299 Ultra-QuickSort 树状数组,归并排序
- jsoup解析的常见用法
- Java常用排序算法/程序员必须掌握的8大排序算法