Если прекратить зависание, это хорошая идея, как мне это сделать безопасно?

Моя программа Delphi в значительной степени зависит от автоматизации Outlook. Outlook версии до 2007 года - SP2, как правило, застревают в памяти из-за плохо написанных дополнений и плохо написанного кода Outlook.

Если Outlook застрял, вызов CreateOleObject ('Outlook.Application') или GetActiveObject... не возвращается и не поддерживает мое приложение, пока Outlook.exe не будет закрыт в диспетчере задач.

Я думал о решении, но я не уверен, что это хорошая практика или нет.

Я бы начал Outlook с CreateOleObject в отдельном потоке, подождать 10 секунд в моем основном потоке и, если Outlook зависает (CreateOleObject не возвращается), предложите пользователю убить процесс Outlook.exe из моей программы.

Но так как я не хочу, чтобы force пользователь мог убить процесс Outlook.exe, в качестве альтернативы мне также нужен способ убить новый поток в моей программе, который теперь висит.

  • Это хорошая практика?
  • Как я могу завершить висячий поток в Delphi без утечки памяти?

Ответ 1

У Windows есть функция TerminateThread, но, как вы можете видеть из замечаний, обычно не рекомендуется использовать ее. Более безопасный подход состоял бы в том, чтобы иметь вторичное приложение, которое взаимодействует с Outlook, и тогда вы можете убить его, не влияя на стабильность своего приложения. TerminateProcess будет работать, но если вы хотите быть немного более дружелюбным к системе, Dr. Dobbs имеет статья о возможно более безопасном подходе с использованием ExitProcess.

Если зависание согласовано и всегда либо происходит, либо не происходит, вы можете просто вызвать CreateOleObject в приложении и выйти, а затем снова вызвать его из своего собственного. Если это противоречиво, вторичное приложение может быть более полной оболочкой, и все взаимодействия будут проходить через него.

Ответ 2

Кроме того, вы можете использовать регистр потока Context.

Вы можете найти образец в;

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