簡體   English   中英

如果終止掛起的線程是個好主意,我該如何安全地進行?

[英]If terminating a hung thread is a good idea, how do I do it safely?

我的Delphi程序在很大程度上依賴於Outlook自動化。 2007-SP2之前的Outlook版本由於編寫錯誤的插件和編寫錯誤的Outlook代碼而傾向於卡在內存中。

如果Outlook卡住,調用CreateOleObject('Outlook.Application')或GetActiveObject ...不會返回並保持我的應用程序掛起,直到任務管理器中的Outlook.exe關閉。

我想到了一個解決方案,但我不確定這是否是好的做法。

我在一個單獨的線程中使用CreateOleObject啟動Outlook,在我的主線程中等待10秒,如果Outlook掛起(CreateOleObject沒有返回),則讓用戶從我的程序中終止Outlook.exe進程。

但是因為我不想強迫用戶殺死Outlook.exe進程,作為替代方案,我還需要一種方法來殺死程序中的新線程,該線程現在一直掛起。

  1. 這是好習慣嗎?
  2. 如何在不泄漏內存的情況下終止Delphi中的掛起線程?

Windows有一個TerminateThread函數,但從備注中可以看出,使用它通常不是一個好主意。 更安全的方法是擁有一個與Outlook交互的輔助應用程序,然后您可以殺死它而不影響您自己的應用程序的穩定性。 TerminateProcess可以工作,但是如果你想對系統更友好一點Dr.Dobbs有一篇關於使用ExitProcess可能更安全的方法的文章

如果掛起是一致的並且始終發生或不發生,您只需在應用程序中調用CreateOleObject並退出,然后再從您自己調用它。 如果它不一致,則輔助應用程序可能是更完整的包裝器,並且所有交互都將通過它。

此外,您還可以使用線程的Context的eip寄存器。

你可以找到一個樣本;

http://www.tugrulhelvaci.com/?p=568

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM