2009-05-22 64 views
7

我可以使用C或Visual C++在Windows CE下獲得線程掛起計數,而無需調用resume或suspend函數嗎?我可以看到這樣做的唯一方法是一樣的東西我如何知道在Windows CE下是否掛起一個線程?

int Count = SuspendThread(ThreadHandle); 
ResumeThread(ThreadHandle); 

這有幾個問題,首先,我寧可不掛起線程,其次掛起可能會失敗,如果線程運行的內核代碼。我可以解決這個問題,但我覺得應該有一個更優雅的解決方案。我也可以使用

int Count = ResumeThread(ThreadHandle); 
SuspendThread(ThreadHandle); 

但是這有類似的問題。從句柄中獲得暫停計數的任何好的替代方法?

回答

4

我有一個組合的解決方案。使用WaitForSingleObject()來確定線程是否被掛起。

如果它不暫停,暫停數顯然是0

如果它的懸掛,它安全地調用SuspendThread()來獲得掛起計數。由於它已經被暫停,你不會拖延任何事情。

+0

是的,這是做到這一點的唯一方法。 – ctacke 2009-05-22 13:41:21

+0

有趣的答案。等待多久,1ms是否可以滿足所有情況,還是可能會變慢? – 2009-05-22 13:58:40

+0

其實我認爲你可以使用等待時間0. WaitForSingleObject()將測試狀態並立即返回。您只想檢查WAIT_OBJECT_0的返回值。這會告訴你線程狀態被髮送,因此不會被掛起。 – ralphtheninja 2009-05-22 14:30:28

0

可能與WaitForSingleObject你可以檢查線程是否被掛起,但你不能檢索掛起計數器。

0

即使線程處於活動狀態,您仍然會收到WAIT_TIMEOUT結果,這是因爲線程只在完成時發出信號,而不是在運行時發出信號。

即WaitForSingleObject(hThread,INFINITE)等待線程完成。

1

您不應該在任何平臺上暫停任何線程。

您應該在線程代碼中添加同步點,以便在允許標記繼續之前顯式等待標記發出信號。這樣你知道它將被暫停,或者至少知道它會在安全點暫停。

上線下面的操作應該被禁止,徹底的,從任何平臺對任何程序員:

  • 暫停
  • 恢復(因爲你不需要它,如果你不能掛起線程)
  • 殺/中止

你應該永遠,永遠,強行從外面線程強加你的意志。你不能保證它在做什麼,它正在鎖定什麼樣的資源。

總是在協作模式下編寫線程。你的線程應該意識到它的周圍環境,並且屈服於外部世界的願望,要麼以有序的方式退出,要麼暫停直到它能夠安全地繼續。

相關問題