Если прекратить зависание, это хорошая идея, как мне это сделать безопасно?
Моя программа 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