Система. Диагностика. Процесс. Запустите странное поведение

8
задан Mendelt 24 September 2008 в 07:58
поделиться

4 ответа

Теперь, я должен проверить это позже, но я уверен, что существует метод, который говорит потоку ожидать, пока это не готово к входу. Вы контролируете процессы GUI только?

Не Процесс. WaitForInputIdle какой-либо справки к Вам? Или я упускаю суть?:)

Обновление

Подписывание на Твиттер болтовни (или твит твита?) с Mendelt я думал, что должен обновить свой ответ, таким образом, сообщество полностью осведомлено..

  • WaitForInputIdle будет только работать над приложениями, которые имеют GUI.
  • Вы указываете время для ожидания, и метод возвращает bool, если процесс достигает состояния ожидания в течение того периода времени, можно, очевидно, использовать это, чтобы циклично выполниться при необходимости, или обработать как соответствующие.

Надежда, которая помогает :)

8
ответ дан 5 December 2019 в 10:45
поделиться

Спасибо за ответы. Это

_process.Start();
_process.WaitForInputIdle();

Кажется, решает проблему. Это все еще странно, потому что Ответ и WaitForInputIdle должен оба использовать тот же win32 вызов API под покрытиями.

Еще некоторая вводная информация
Приложения GUI имеют главное окно с очередью сообщений. Ответ и WaitForInputIdle работает путем проверки, обрабатывает ли процесс все еще сообщения от этой очереди сообщений. Поэтому они только работают с приложениями для GUI. Так или иначе кажется, что вызов Ответа слишком быстро вмешивается в получение Процесса, получая дескриптор к той очереди сообщений. Вызов WaitForInputIdle, кажется, решает ту проблему.

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

обновление
Кажется, что, получая дескриптор окна, связанный с процессом сразу после того, как, запуска достаточно для инициирования странного поведения. Как это:

_process.Start();
IntPtr mainWindow = _process.MainWindowHandle;

Я сверился с Отражателем, и это - то, что Ответ делает под покрытиями. Кажется, что, если Вы получаете MainWindowHandle слишком скоро, Вы получаете неправильный, и это использует этот неправильный дескриптор это для остальной части времени жизни процесса или пока Вы не называете Обновление ();

обновление
Вызов WaitForInputIdle () только решает проблему часть времени. При вызове Обновления () каждый раз Вы читаете, свойство Responding, кажется, работает лучше.

3
ответ дан 5 December 2019 в 10:45
поделиться

Я думаю, что может быть лучше улучшить проверку на _process. Ответ так, чтобы Вы только попытались остановиться/уничтожить процесс, если свойство Responding возвращает false больше 5 секунд (например).

Я думаю, что можно найти, что довольно часто, приложения не могут "отвечать" в течение доли секунды, пока они делают более интенсивную обработку.

Я полагаю, что более снисходительный подход будет работать лучше, позволяя процессу "не ответить" в течение короткого срока, только принимая меры, если он неоднократно "не ответит" в течение нескольких секунд (или однако долго Вы хотите).

Дальнейшее примечание: документация Microsoft указывает, что свойство Responding конкретно касается пользовательского интерфейса, который является, почему недавно запущенный процесс не может иметь, это - UI, отвечающий сразу.

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

Я также заметил это в проекте приблизительно 2 года назад. Я назвал.Refresh () прежде, чем запросить определенные значения опоры. IT был эмпирическим подходом для нахождения, когда я должен был назвать.Refresh ().

1
ответ дан 5 December 2019 в 10:45
поделиться
Другие вопросы по тегам:

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