Надписи на потоках или гравюра по водной глади
От: Plutonia Experiment Беларусь http://blogs.rsdn.org/ikemefula
Дата: 11.04.03 08:57
Оценка: 88 (8)
Привет !

Намедни отлаживал програмулину. В ней несколько потоков и каждый из них занимается совершенно непонятными делами, причем многие опкрации похожие. Устал разгребать логи сообщений. Идентификатор потока не особенно помогает. Нужно обязательно имя функции потока.

Налабал решение, которое подписавает поток средствами 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;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.