Как завершить программу c
Перейти к содержимому

Как завершить программу c

Как правильно выйти из приложения C #?

У меня есть опубликованное приложение на C #. Проблема здесь в том, что всякий раз, когда я закрываю основную форму, нажимая на красную кнопку выхода, она закрывает форму, но не закрывает приложение. Я узнал об этом, когда попытался выключить компьютер, надеясь, что приложение, которое я создал, работало без сбоев, а затем я был засыпан множеством дочерних окон, с которыми я установил MessageBox оповещения.

Я пытался, Application.Exit но он по-прежнему вызывает все дочерние окна и оповещения, и я не знаю, как использовать Environment.Exit и какое целое число вставить в него.

Кстати, всякий раз, когда мои формы вызывают событие formclosed или, form closing я закрываю приложение с помощью this.Hide() функции; Влияет ли это на поведение моего приложения сейчас?

Информирует все рассылки сообщений о том, что они должны прекратить работу, а затем закрывает все окна приложений после обработки сообщений. Этот код используется, если вы вызвали Application.Run (приложения WinForms), этот метод останавливает все выполняющиеся циклы сообщений во всех потоках и закрывает все окна приложения.

Завершает этот процесс и дает базовой операционной системе указанный код выхода. Это код для вызова, когда вы используете консольное приложение.

Эта статья, Application.Exit vs. Environment.Exit , указывает на хороший совет:

Вы можете определить System.Windows.Forms.Application.Run , был ли вызван, проверив System.Windows.Forms.Application.MessageLoop свойство. Если true, то был вызван Run, и вы можете предположить, что приложение WinForms выполняется следующим образом.

Я знаю, что это не та проблема, с которой вы столкнулись, однако еще одна причина, по которой это может произойти, заключается в том, что в вашем приложении открыт не фоновый поток.

Когда IsBackground это false будет держать вашу программу открыты до резьбы Завершает, если вы установите IsBackground на true резьбу не будет держать программу открытой. Такие вещи, как BackgroundWoker , ThreadPool и Task все внутренне используют поток с IsBackground установленным на true .

Все, что тебе нужно System.Environment.Exit(1);

И он использует системное пространство имен «using System», которое почти всегда присутствует при запуске проекта.

Я бы выбрал одно из следующих:

для консольного приложения (работает также на winforms).

Кстати. всякий раз, когда мои формы вызывают событие formclosed или закрытия формы, я закрываю приложение с помощью функции this.Hide (). Влияет ли это на поведение моего приложения сейчас?

Короче да. Все приложение закончится, когда основная форма (форма, запущенная Application.Run в Main методе) будет закрыта (не скрыта).

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

Если вы хотите, чтобы пользователь мог щелкнуть «x» для основной формы, но оставить другую форму открытой и, по сути, стать «новой» основной формой, то это немного сложнее. В таком случае вам нужно будет просто скрыть свою основную форму, а не закрывать ее, но вам нужно будет добавить какой-то механизм, который фактически закроет основную форму, когда вы действительно хотите, чтобы ваше приложение заканчивалось. Если вы находитесь в такой ситуации, вам нужно добавить больше вопросов к вашему вопросу, описывающих, какие типы приложений должны и не должны завершать программу.

Как сделать выход из консольной программы C ++?

В то время как вы можете вызвать exit() (и, возможно, потребуется сделать это, если ваше приложение обнаружит фатальную ошибку ), самый чистый способ выхода из программы — это возврат из main() :

Когда вы вызываете exit() , объекты с автоматической продолжительностью хранения (локальные переменные) не уничтожаются до завершения программы, поэтому вы не не получить надлежащую очистку. Этим объектам может потребоваться очистить любые ресурсы, которыми они владеют, сохранить любые ожидающие изменения состояния, завершить все запущенные потоки или выполнить другие действия, чтобы программа завершала работу корректно.

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

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

Если вы обнаружили ошибку где-то глубоко в вашем коде и вам нужно выйти, вы должны выдать исключение, чтобы вернуться к основной функции. Как и в следующем.

Это приводит к разматыванию стека и разрушению всех переменных вашего стека. Все еще очень важно. Обратите внимание, что уместно указывать сбой с ненулевым возвращаемым значением.

Если в маловероятном случае, когда ваша программа обнаружит условие, которое указывает на то, что больше не безопасно выполнять больше операторов, вам следует использовать std :: abort (). Это приведет к внезапной остановке вашей программы без дальнейшей обработки. std :: exit () похож, но может вызывать обработчики atexit, что может быть плохо, если ваша программа достаточно загружена.

Да! exit() . Он находится в <cstdlib> .

Разрешение потоку выполнения покинуть main с помощью возвращая значение или позволяя выполнению достичь конца функции — это способ, которым программа должна завершиться, за исключением случаев, когда невозможно исправить. Возвращать значение необязательно в C ++, но я обычно предпочитаю возвращать EXIT_SUCCESS , найденный в cstdlib (специфичное для платформы значение, которое указывает на выполненную программу успешно).

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

Например, создание исключения из деструктора — почти всегда ужасная идея, потому что уничтожаемый объект мог быть уничтожен, потому что исключение уже было сгенерировано. Если выдается второе исключение, вызывается terminate , и ваша программа останавливается без дальнейшей очистки. Вы можете использовать uncaught_exception , чтобы определить, безопасно ли это, но обычно лучше не допускать, чтобы исключения выходили из деструктора.

Хотя обычно для функций, которые вы вызываете, но не пишете, всегда есть возможность генерировать исключения (например, new выбрасывает std::bad_alloc , если он не может выделить достаточно памяти), начинающим программистам часто бывает трудно отследить или даже узнать обо всех специальных правилах, окружающих исключения в C ++. По этой причине я рекомендую использовать их только в тех случаях, когда у вашей программы нет разумного способа продолжить выполнение.

exit является удержанием для C и может привести к тому, что объекты с автоматическим хранением не будут очищены должным образом. abort и terminate эффективно заставляют программу совершить самоубийство и определенно не очистит ресурсы.

Что бы вы ни делали, не используйте исключения, exit или abort / terminate как опора для написания правильно структурированной программы. Сохраните их для исключительных ситуаций.

если вы находитесь в основном, вы можете сделать:

Код выхода зависит от семантики вашего кода. 1 — ошибка 0, нормальный выход.

Справочник по C#

twitter facebookgoogle plusrss feedemail

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

Завершение работы процесса

  • Пример №1 – использование метода «Kill» из класса «System.Diagnostics»;
  • Пример №2 – завершение процессов по идентификаторам или именам исполняемых файлов на локальной или удаленной системе с использованием команды «TASKKILL»;
  • Пример №3 – использование Windows API функции «TerminateProcess» из библиотеки «Kernel32.lib».

Пример №2

Данный пример описывает завершение процессов по идентификаторам или именам исполняемых файлов на локальной или удаленной системе с использованием команды «TASKKILL». Команда может использоваться в операционных системах Windows XP и старше.

  • /F — Принудительное завершение процесса.
  • /IM <имя процесса> — Имя образа процесса, который требуется завершить. Знак подстановки «*» может быть использован для указания всех заданий или имен образов.
  • /T — Завершение указанного процесса и всех его дочерних процессов.
  • TASKKILL /IM notepad++.exe — завершение процесса, исполняемым образом которого является notepad.exe++. Если таких процессов более одного — то будут завершены все;
  • TASKKILL /PID 1568 /T — завершить процесс с идентификатором 1568 и все его дочерние процессы (/T) . Одной командой можно завершить несколько процессов, задавая их PID — taskkill /PID 1568 /PID 1569 /PID 1570;
  • TASKKILL /F /FI «PID ge 2015» /FI «WINDOWTITLE eq Arc*» — принудительно (/F) завершить процесс, идентификатор которого больше или равен 2000 и заголовок окна которого , начинается с текста Arc;
  • TASKKILL /F /FI «USERNAME eq NT AUTHORITY\SYSTEM» /IM notepad++.exe — принудительно завершить процесс, выполняющийся в контексте учетной записи NT AUTHORITY\SYSTEM и исполняемый файл которого имеет имя notepad.exe++;
  • TASKKILL /S 192.168.1.105 /U MyDomain\user /FI «USERNAME ne NT*» /IM * — завершить все процессы, выполняющиеся в контекстах учетных записей, не начинающихся со строки NT на компьютере с IP-адресом 192.168.0.243. При подключении к удаленной системе используется имя пользователя user в домене Mydomain. Пароль не задан и будет запрошен при выполнении команды;
  • TASKKILL /S SERVER /U Mydomain\User /P UserPass /FI «IMAGENAME eq note*» — завершить все процессы, имя исполняемого файла которых начинается со строки note на удаленном компьютере с именем SERVER.

В данном примере для завершения работы процесса используется Windows API функция «TerminateProcess» из библиотеки «Kernel32.lib». Функция не дает процессу ни малейшего шанса самому провести очистку, операционная система высвобождает все принадлежавшие ему ресурсы: возвращает себе выделенную им память, закрывает любые открытые файлы, уменьшает счетчики соответствующих объектов ядра и разрушает все его User- и GDI-объекты.
После завершения процесса система гарантирует: после него ничего не останется — даже намеков на то, что он когда-то выполнялся. Завершенный процесс не оставляет за собой никаких следов. Синтаксис данной функции представлен ниже.
Параметр «hProcess» идентифицирует описатель завершаемого процесса, а в параметре «uExitCode» возвращается код завершения процесса.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *