none
Создание и завершение процесса с помощью System.Diagnostics.Process RRS feed

  • Вопрос

  • Добрый день

    Имеется приложение Windows.Forms, но запускаемое со скрытой главной формой, т.е. вызывается Application.Run() вместо Application.Run( form ).

    Это приложение необходимо запускать и, по некоторому действию пользователя, завершать. При завершении надо, чтобы приложение успело сохранить свои данные, т.е. обработать какое-то событие, скажем. Сейчас для запуска процесса используется класс System.Diagnostics.Process, в котором есть 2 функции для завершения запущенного процесса: это Kill() и CloseMainWindow(). Второй вариант не подходит, т.к. приложение не имеет открытого окна. Вопрос в том, посылает ли Kill() какое-то сообщение, которое можно было бы обработать для "аккуратного" завершения приложения?

    Спасибо.

Ответы

Все ответы

  • Краткий ответ: не используйте Process.Kill().

    Для более полного ответа нужно знать, что и как делает ваше приложение. Ну запустился цикл сообщений вызовом Application.Run(), а дальше что? Как происходит взаимодействие с этим приложением? И как оно хоть что-то делает?

    Конечно, есть события Application.ThreadExit и Application.ApplicationExit, но против Process.Kill() они бессильны (насколько я знаю).

  • А не проще будет запустить форму установив у нее ShowInTaskBar = false,
    и WindowsState= Minimized? Форму видно не будет, зато можно будет
    воспользоваться CloseMainWindow.
     
    Модератор
  • А не проще будет запустить форму установив у нее ShowInTaskBar = false,
    и WindowsState= Minimized? Форму видно не будет, зато можно будет
    воспользоваться CloseMainWindow.
    Почему-то при установке "ShowInTaskBar = false" у приложения, CloseMainWindow() не срабатывает для него. А так, наверное, можно было бы воспользоваться этим подходом, хотя и остается возможность пользователю отобразить форму на экране, что не есть хорошо.
  • Для более полного ответа нужно знать, что и как делает ваше приложение. Ну запустился цикл сообщений вызовом Application.Run(), а дальше что? Как происходит взаимодействие с этим приложением? И как оно хоть что-то делает?

    В приложении на форме присутствуют некие ActiveX, которые делают своё "черное" дело. Но отображать их смысла нет, поэтому форма и прячется. Я пытался через Application.AddMessageFilter() добавить обработку для событий WM_CLOSE/WM_DESTROY/WM_QUIT, но как-то это не возымело эффекта. То ли неправильно задаю фильтр, то ли неправильно посылаю сообщения извне.
  • Как вариант, можно использовать что-то из межпроцессных взаимодействий. Например, Mutex.

    • Помечено в качестве ответа Abolmasov Dmitry 30 мая 2012 г. 12:21
    Отвечающий
  • Привет

    Вы решили проблему или она еще требует решения?


    Для связи [mail]

  • Скорее, не mutex, а EventWaitHandle

    В запускаемом приложении ждать именованного события (в отдельном потоке), дождавшись - выходить из приложения.

    В основном приложении - создать событие с тем же именем, и сделать ему Set();

    • Помечено в качестве ответа Abolmasov Dmitry 30 мая 2012 г. 12:21
  • Проблему решил с помощью AnonymousPipeServerStream/AnonymousPipeClientStream. Правда, если нужно только одно логическое событие, наверное правильнее использовать EventWaitHandle, как указал PashaPash
    • Помечено в качестве ответа Abolmasov Dmitry 6 июня 2012 г. 10:32
    6 июня 2012 г. 10:26
  • А если приложение зациклилось в сторонней функции (в COM обьекте),  и из нее не выходит, как сделать корректный выход из приложения (приложение запущено Diagnostics.Process.Start) , остановить выполнение функции и очистить ресурсы COM? 

    13 июня 2012 г. 15:12