2012-02-20 19 views
13

Wiem o nieintuicyjnym procesie ustawiania nazwy wątku pod Windows (zobacz "How to set name to a Win32 Thread?"). Czy istnieje sposób na uzyskanie nazwy wątku? Nie widzę żadnego interfejsu Windows API, który pozwala mi to zrobić (http://msdn.microsoft.com/en-us/library/windows/desktop/ms684847(v=vs.85).aspx).Jak uzyskać nazwę wątku Win32?

+1

Można uzyskać nazwę funkcji początek wątku, jeśli który pomaga Ci w jakikolwiek sposób. – Nawaz

+0

@Nawaz Jak byś to zrobił? –

+1

@CS .: Musisz używać tych interfejsów API: [SymInitialize] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms681351%28v=vs.85%29.aspx) i [SymFromAddr] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms681323%28v=vs.85%29.aspx). Użyłem ich, zobacz ten temat: [Get StartAddress wątku Win32 z innego procesu] (http://stackoverflow.com/questions/8679406/get-startaddress-of-win32-thread-from-another-process) – Nawaz

Odpowiedz

12

Nie ma takiego wywołania WinAPI, ponieważ nie istnieje coś takiego jak nazwy wątków.

Jeśli ustawisz nazwę wątku, to debugger Twojego IDE zapamięta go dla ciebie, co ułatwia debugowanie. Jednak nazwa nigdy nie jest dołączona do wątku przez wywołanie interfejsu API systemu Windows.

Jeśli uruchomisz aplikację bez debuggera, ustawienie nazwy wątku nie przyniesie efektu, dlatego nie możesz pobrać nazwy.

Nawet jeśli byłby dostępny - nie napisałbym kodu, który działa tylko z dołączonym debuggerem. Lepiej przechowuj nazwę dla siebie wraz z uchwytem.

+0

czy mówisz, że nie ma absolutnie żadnego sposobu na uzyskanie nazwy wątku, który ustawiłeś w debugerze? Chciałbym umieścić kod debugowania w moim kodzie, aby upewnić się, że jest wywoływany z właściwego wątku, używając nazwy wątku – Arthur

+0

Wątek 0x66c zakończył kod 0 (0x0) -> Pomyślałem, że może 0x66c jest coś takiego imię ? – Andre

17

Wątki w rzeczywistości nie mają nazw w Win32. Proces przez RaiseException jest po prostu "tajnym uzgadnianiem" z VS Debugger, który faktycznie przechowuje TID => Mapowanie nazw. Sam system Windows nie ma pojęcia o wątku "Nazwa".

7

Począwszy od wersji systemu Windows 10, 1607, można teraz uzyskać nazwę wątku, używając GetThreadDescription(), zakładając SetThreadDescription() została wykorzystana, aby ustawić nazwę wątku.

Oto przykład:

HRESULT hr = GetThreadDescription(ThreadHandle, &data); 
if (SUCCEEDED(hr)) 
{ 
    wprintf(“%ls\m”, data); 
    LocalFree(data); 
} 

Oto dokumentacja:

https://msdn.microsoft.com/en-us/library/windows/desktop/mt774972(v=vs.85).aspx