2011-11-18 62 views
3

我真正搜索的是C++/win32等效.net ThreadState Enumeration如何確定一個win32線程是在等待或加入或睡眠狀態在c + +

有什麼建議嗎?

+0

NtQuerySystemInformation()但它沒有記錄。只有書面的方式是Win32_Thread類的WMI。 –

+0

謝謝大家爲你解答我真的很感謝你的努力!但是,我正在尋找像BOOL IsThreadInWaitJoinSleep(HANDLE threadHandle)?還有其他建議嗎? – Honzajscz

+1

你不明白。同樣的原因,你不能發現一個文件被鎖定而沒有實際嘗試打開它。因爲這樣的操作在多任務操作系統上絕對無法使用。一納秒後,文件可能被鎖定。或者線程可能被阻塞。 –

回答

3

這些之間幾乎沒有什麼區別,都是等待不同的內核對象。

「等待」我假設你的意思是「I/O等待」。 「加入」只是「等待線程/進程」。 而「睡眠」是「等待一個計時器」。

更復雜的是,一個線程可能正在等待一些內核對象的組合。

您可以使用內核調試器找出線程正在等待什麼對象以及這些對象的類型。我不認爲有任何簡單的方法。

2

沒有直接的等價物 - 管理和非管理線程不應該被視爲相同。見here

的操作系統的ThreadId具有到管理 線程沒有固定的關係,因爲非託管主機可以控制 管理和非管理線程之間的關係。具體而言,一個複雜的主機可以使用光纖API來針對同一個操作系統線程調度多個託管線程,或者在不同的 操作系統線程之間移動託管線程。

1

使用winapi可以輕鬆訪問的本地線程的唯一狀態是知道線程是否已完成其執行。只需使用功能WaitForSingleObject()與線程處理和0超時:

DWORD res = WaitForSingleObject(handleThread, 0); 
switch (res) 
{ 
    case WAIT_OBJECT_0: 
     printf("The thread has finished\n"); 
     break; 
    case WAIT_TIMEOUT: 
     printf("The thread is still running\n"); 
     break; 
    default: 
     printf("Unknown error (shouldn't happen)\n"); 
     break; 

} 
1

「問題」是,.NET運行時有你的.NET線程的所有權。因此,例如,當您調用Abort時,運行時內部函數會在.NET線程的.NET上下文中拋出ThreadAbortException異常,這就是您可以使用catch(ThreadAbortException)在線程中捕獲它的方式。

對於ThreadState也是如此,因爲它具有線程的基礎所有權,它確切知道它在做什麼,因此可以生成有效的線程狀態。

由於沒有非黑客的方式來正式查詢線程的內部狀態,所以可以將其包裝在一個類中。但是,你會完全依賴線程方法來堅持任何.Abort() - 請求。

相關問題