Привет !
Намедни отлаживал програмулину. В ней несколько потоков и каждый из них занимается совершенно непонятными делами, причем многие опкрации похожие. Устал разгребать логи сообщений. Идентификатор потока не особенно помогает. Нужно обязательно имя функции потока.
Налабал решение, которое подписавает поток средствами WINAPI, дабы не мучаться с синхронизацией.
Работоспосбно, теоретически, под
всеми версиями винды, начиная с 95х и WinNT 3.1 и даже Win CE
Теоретически — не могу проверить под СЕ и NT3.1 за неимением таковых.
В каждом потоке пишем примерно так:
DWORD WINAPI Thread1(LPVOID lpv)
{
CThreadName threadName("Thread1\n");
....
ATLTRACE("[%s] operation finished successfully\n",CThreadName::GetThreadName()));
....
return 0;
}
Вот само решение:
class CThreadName
{
public:
CThreadName(LPCTSTR szName)
{
if(s_dwNameIndex == TLS_OUT_OF_INDEXES)
{
s_dwNameIndex = TlsAlloc();
}
if(s_dwNameIndex != TLS_OUT_OF_INDEXES)
{
LPTSTR str = new TCHAR[lstrlen(szName)+1];
lstrcpy(str,szName);
TlsSetValue(s_dwNameIndex,str);
s_dwThreads++;
}
}
~CThreadName()
{
if(s_dwNameIndex != TLS_OUT_OF_INDEXES)
{
delete [] (TCHAR*)TlsGetValue(s_dwNameIndex);
TlsSetValue(s_dwNameIndex,NULL);
s_dwThreads--;
if(s_dwThreads == 0)
{
TlsFree(s_dwNameIndex);
s_dwNameIndex = TLS_OUT_OF_INDEXES;
}
}
}
static LPCTSTR GetThreadName()
{
if(s_dwNameIndex != TLS_OUT_OF_INDEXES)
return (LPCTSTR)TlsGetValue(s_dwNameIndex);
else
return NULL;
}
private:
static DWORD s_dwNameIndex;
static DWORD s_dwThreads;
};
DWORD CThreadName::s_dwNameIndex = TLS_OUT_OF_INDEXES;
DWORD CThreadName::s_dwThreads = 0;