2016-07-14 195 views
0

我需要創建一個線程,試圖在特定的時間內執行一個函數。如果線程沒有成功,我需要用一個表示錯誤的數字來完成他。如何設置超時到MFC線程

我想這樣做是因爲我必須執行的程序的外部庫,但有時會進入無限循環以搜索尚未就緒的資源,並且程序暫停等待該功能。

+0

您是否開始開發過程?請分享你的代碼 – ddb

+0

請記住,如果你終止一個線程,它所持有的鎖和外部資源將不會被釋放。 –

+2

而且,雖然正確,@ RichardCritten的評論聽起來並不像應該那麼危險。鎖發揮中心作用的常見情況是序列化堆訪問。如果您[TerminateThread](https://msdn.microsoft.com/en-us/library/windows/desktop/ms686717.aspx)線程正處於分配內存的中間位置,則任何後續嘗試分配內存相同的堆將等待鎖定,永遠不會被釋放。所以你和死鎖交換了無限循環。這是朝某個方向邁出的一步,而不是前進。 – IInspectable

回答

1

您不能通過將錯誤實現卸載到同一進程中的另一個線程來解決這個問題,因爲如果它發生衝突,沒有辦法安全地關閉該線程。調用TerminateThread是從外部取下線程的唯一方法。由於其後果,當一個過程必須繼續可靠地運行時,它不能被使用。

例如,TerminateThread可能會導致以下問題:

  • 如果目標線程擁有臨界區,臨界區將不會被釋放。
  • 如果目標線程正在從堆中分配內存,堆鎖將不會被釋放。
  • 如果目標線程在終止時正在執行某些kernel32調用,則線程進程的kernel32狀態可能不一致。
  • 如果目標線程正在操作共享DLL的全局狀態,則DLL的狀態可能會被破壞,從而影響DLL的其他用戶。

你唯一的選擇是:

  1. 請求來自第三方庫的供應商一個修正錯誤。
  2. 將第三方庫卸載到自己的進程中。在這個代理過程中,您可以在自己的線程上運行第三方庫,如果它沒有及時返回(使用WaitForSingleObject和超時值來確定該條件),請致電ExitProcess以結束痛苦。您必須在您的流程之間實施interprocess communications才能運行。