2013-05-23 2 views
2

을 ThreadId. 안타깝게도 Windows XP에서는이 호출을 사용할 수없고 주위를 검색 한 후에는 을 통해 모든 스레드를 탐색하여 XP에 대한 대체 시스템 지원을 제공하는 솔루션을 찾았습니다. Thread32First()Thread32Next() WINAPI의 기능.번역 부스트 : : 스레드 -> native_handle() 나는 <strong>GetThreadId (HANDLE)</strong>를 사용하여 <strong>부스트 : 스레드</strong>에서()</strong><strong>native_handle에서 윈도우 ThreadId을 얻기 위해 관리했습니다

내가 한면에서 native_handle()/핸들 일치하는 방법을 지금하지 않습니다 ... 이것은 어떻게 든 작업을 수행하지만 내 문제는 내가 현재 내 프로세스의 스레드를 식별하는 데에만 수있어입니다 적절한 THREADENTRY32에서 루프 순회.

THREADENTRY32 te32; 
//... 
do { 
    if(te32.th32OwnerProcessID == GetCurrentProcessId()) { 
     DWORD threadId = te32.th32ThreadID; 
     printf("\n  THREAD ID  = 0x%08X", te32.th32ThreadID); 
    } 
} while(Thread32Next(hThreadSnap, &te32)); 

아무도 도와 줄 수 있습니까? boost :: thread-> native_handle()을 WindowsXP의 ThreadId로 어떻게 변환합니까?

대단히 감사합니다!

답변

2

HANDLE을 찾을 때까지 루프의 각 스레드 ID를 OpenThread()으로 전달하십시오. 예를 들어 : 좋은 측정을 위해

HANDLE hBoostThread = ...; // from boost::thread->native_handle() 
DWORD dwBoostThreadID = 0; 

THREADENTRY32 te32; 
//... 
do 
{ 
    if(te32.th32OwnerProcessID == GetCurrentProcessId()) 
    { 
     HANDLE hThread = OpenThread(THREAD_ALL_ACCESS, FALSE, te32.th32ThreadID); 
     if (hThread != NULL) 
     { 
      if (hThread == hBoostThread) 
      { 
       CloseHandle(hThread); 
       dwBoostThreadID = te32.th32ThreadID; 
       break; 
      } 
      CloseHandle(hThread); 
     } 
    } 
} 
while(Thread32Next(hThreadSnap, &te32)); 

, 당신은 GetThreadId()은 기본적으로 사용할 수 없습니다 때마다 코드의 차이를 알 필요가 없습니다 있도록 호출 할 수 함수 내에서이 포장 수, 예를 들면 :

DWORD WINAPI MyGetThreadId(HANDLE Thread) 
{ 
    THREADENTRY32 te32; 

    HANDLE hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0); 
    if (hThreadSnap == INVALID_HANDLE_VALUE) 
     return 0; 

    if (Thread32First(hThreadSnap, &te32)) 
    { 
     do 
     { 
      HANDLE hOpenThread = OpenThread(THREAD_ALL_ACCESS, FALSE, te32.th32ThreadID); 
      if (hOpenThread != NULL) 
      { 
       if (hOpenThread == Thread) 
       { 
        CloseHandle(hOpenThread); 
        CloseHandle(hThreadSnap); 
        return te32.th32ThreadID; 
       } 

       CloseHandle(hOpenThread); 
      } 
     } 
     while(Thread32Next(hThreadSnap, &te32)); 
    } 

    CloseHandle(hThreadSnap); 
    return 0; 
} 

typedef DWORD (WINAPI *LPFN_GTID)(HANDLE); 

LPFN_GTID lpGetThreadId = (LPFN_GTID) GetProcAddress(GetModuleHandle("kernel32"), "GetThreadId"); 
if (!lpGetThreadId) 
    lpGetThreadId = &MyGetThreadId; 

DWORD dwThreadID = lpGetThreadId((HANDLE) boost::thread->native_handle()); 
그렇게 말 691,363,210

은 더 나은 옵션을 직접하는 대신 수동으로 사냥하는 것을 시도의 자체 ID의 대상 스레드 자체를 조회하는 것입니다

typedef long (WINAPI *LPFN_NTQIT)(HANDLE thread, int infoclass, void *buf, long size, long *used); 

typedef struct _THREAD_BASIC_INFORMATION 
{ 
    ULONG ExitStatus; 
    void* TebBaseAddress; 
    ULONG UniqueProcessId; 
    ULONG UniqueThreadId; 
    ULONG AffinityMask; 
    ULONG BasePriority; 
    ULONG DiffProcessPriority; 
} THREAD_BASIC_INFORMATION; 

DWORD WINAPI MyGetThreadId(HANDLE Thread) 
{ 
    DWORD dwThreadId = 0; 

    HMODULE hLib = LoadLibrary("ntdll.dll"); 
    if (hLib != NULL) 
    { 
     LPFN_NTQIT lpNtQueryInformationThread = (LPFN_NTQIT) GetProcAddress(hLib, "NtQueryInformationThread"); 

     if (lpNtQueryInformationThread != NULL) 
     { 
      THREAD_BASIC_INFORMATION tbi = {0}; 
      ULONG used = 0; 

      if (lpNtQueryInformationThread(Thread, 0, &tbi, sizeof(tbi), &used) == 0) 
       dwThreadId = tbi.UniqueThreadId; 
     } 

     FreeLibrary(hLib); 
    } 

    return dwThreadId; 
} 
+0

대단히 감사합니다! – Hhut