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

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

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

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

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

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

  1. Эта хорошая практика?
  2. Как я могу завершить зависающий поток в Delphi, не пропуская память?
10
задан Rob Kennedy 5 April 2010 в 04:23
поделиться

2 ответа

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

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

10
ответ дан 4 December 2019 в 01:30
поделиться

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

Вы можете найти образец по адресу:

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

0
ответ дан 4 December 2019 в 01:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: