Я изучаю С#, следуя инструкциям в MSDN. Теперь я просто попробовал пример 1 (вот ссылка на MSDN), и я столкнулся с проблемой: почему закрытие окна консоли сразу после отображения моего вывода?
using System; public class Hello1 < public static int Main() < Console.WriteLine(«Hello, World!»); return 0; >>
user962206 15 янв. 2012, в 09:49
Поделиться
Вы можете попробовать открыть с консоли. Перетащите его на консоль и нажмите «Enter».
Я предполагаю, что это файл EXE.
Sajidur Rahman 25 янв. 2018, в 19:16
Если вы пытаетесь отладить программу командной строки, которая запускается внешним процессом, посмотрите этот вопрос: stackoverflow.com/a/23334014/3195477
DaveInCaz 26 нояб. 2018, в 16:54
Поделиться:
console-application
20 ответов
Лучший ответ
проблема здесь в том, что их программа Hello World появляется, и она сразу же закрывается.
это почему?
Потому что он закончил. Когда консольные приложения завершили выполнение и возвращаются из main метода, соответствующее окно консоли автоматически закрывается. Это ожидаемое поведение.
Выскакивает командная строка CMD Как убрать
Если вы хотите сохранить его открытым для целей отладки, вам нужно указать компьютеру ждать нажатия клавиши, прежде чем закрыть приложение и закрыть окно.
Метод Console.ReadLine — это один из способов сделать это. Добавление этой строки в конец вашего кода (непосредственно перед оператором return ) заставит приложение ждать, пока вы не нажмете клавишу.
В качестве альтернативы вы можете запустить приложение без отладчика, подключенного при нажатии Ctrl + F5 из среды Visual Studio, но это имеет очевидный недостаток, препятствующий использованию функций отладки, которые вы, вероятно, захотите в своем распоряжении, когда написания приложения.
Лучшим компромиссом, вероятно, является вызов метода Console.ReadLine только при отладке приложения путем его переноса в директиву препроцессора. Что-то вроде:
#if DEBUG Console.WriteLine(«Press enter to close. «); Console.ReadLine(); #endif
Возможно, вы также захотите, чтобы окно оставалось открытым, если было выбрано неперехваченное исключение. Для этого вы можете поместить Console.ReadLine(); в блоке finally :
#if DEBUG try < //. >finally < Console.WriteLine(«Press enter to close. «); Console.ReadLine(); >#endif
Cody Gray 15 янв. 2012, в 08:37
Поделиться
Кроме того, вы можете использовать Console.ReadKey ();
PlantationGator 26 март 2013, в 21:36
Лично я предпочитаю, if (System.Diagnostics.Debugger.IsAttached) Console.ReadLine(); ,
Sameer Singh 21 нояб.
2013, в 08:28
Почему работа без отладки меняет это поведение? Вы думаете, что это должен быть более точный опыт, а не меньше.
Kyle Delaney 05 сен. 2017, в 00:31
Показать ещё 1 комментарий
Console.Readline() Console.Read() Console.ReadKey()
вы можете запустить свою программу, используя Ctrl + F5 (если вы находитесь в Visual Studio). Затем Visual Studio откроет окно консоли, пока вы не нажмете клавишу.
Командная строка закрывается после выполнения команды (Решение)
Примечание. Вы не можете отлаживать свой код при таком подходе.
Bhavik Patel 09 сен. 2013, в 17:27
Поделиться
Привет, пользователь. Я новый пользователь VS и C # в целом, а также. Что Ctrl + F5 делает по-другому, а просто красивая Start — иначе?
theGreenCabbage 26 нояб. 2013, в 17:36
к сожалению, иногда он перестает работать, как ожидалось.
MaikoID 19 дек. 2013, в 13:14
Причиной проблемы является то, что Windows автоматически закрывает окно терминала при остановке программы. Другие системы будут держать окно открытым автоматически. Это гораздо лучший способ запустить программу. Не используйте ReadKey, Read или ReadLine для этого материала, так как это предотвращает использование вашей программы в сочетании с другими консольными приложениями и конвейерами.
realtime 23 июль 2014, в 14:33
Показать ещё 1 комментарий
Это ведет себя одинаково для Ctrl F5 или F5 . Поместите немедленно до конца метода Main .
using System.Diagnostics; private static void Main(string[] args) < DoWork(); if (Debugger.IsAttached) < Console.WriteLine(«Press any key to continue . . .»); Console.ReadLine(); >>
user3484993 22 март 2015, в 14:08
Поделиться
Просто чтобы заметить, последняя строка должна быть Console.ReadKey() для любой клавиши, Console.ReadLine() ожидает нажатия клавиши ввода
Chris 29 янв. 2016, в 13:01
Я предполагаю, что причина, по которой вы не хотите, чтобы она закрывалась в режиме отладки, заключается в том, что вы хотите посмотреть на значения переменных и т.д. Поэтому лучше всего просто вставить точку останова при закрытии «>» основная функция. Если вам не нужно отлаживать, лучше выбрать Ctrl-F5.
Rob L 17 фев. 2016, в 23:22
Поделиться
Удивленный, ни один из других ответов не предложил это. Редко, когда ответ с новой опцией добавляется так поздно после создания вопроса.
Scott Chamberlain 17 фев. 2016, в 22:37
Программа немедленно закрывается, потому что ничего не останавливает ее от закрытия. Вставьте точку останова в return 0; или добавьте Console.Read(); до return 0; , чтобы программа не закрылась.
Robert Rouhani 15 янв. 2012, в 08:52
Поделиться
Другим способом является использование Debugger.Break() перед возвратом из метода Main
dimaaan 24 март 2015, в 20:05
Поделиться
Хотя это переключает фокус обратно на окно отладчика и потенциально скрывает содержимое окна консоли.
Stephen Turner 26 окт. 2017, в 10:26
В качестве альтернативы вы можете отсрочить закрытие, используя следующий код:
System.Threading.Thread.Sleep(1000);
Обратите внимание, что Sleep использует миллисекунды.
gotqn 07 дек. 2014, в 13:42
Поделиться
Использовать Console.Read(); чтобы программа не закрывалась, но убедитесь, что вы добавили код Console.Read(); перед возвратом, иначе это будет недостижимый код.
Console.Read(); return 0;
Ravi Gadag 15 янв. 2012, в 09:24
Поделиться
Добавьте метод Read , чтобы показать результат.
Console.WriteLine(«Hello, World!»); Console.Read(); return 0;
John Woo 15 янв. 2012, в 08:50
Поделиться
Код закончен, чтобы продолжить, вы должны добавить это:
Console.ReadLine();
Console.Read();
Ari 15 янв. 2012, в 08:18
Поделиться
Если вы хотите, чтобы ваше приложение оставалось открытым, вам нужно что-то сделать, чтобы поддержать его процесс. Ниже приведен простейший пример, который нужно поместить в конец вашей программы:
while (true) ;
Тем не менее, это вызовет перегрузку ЦП, поскольку он вынужден бесконечно повторяться.
На этом этапе вы можете использовать класс System.Windows.Forms.Application (но для этого необходимо добавить ссылку System.Windows.Forms ):
Application.Run();
Это не утечка процессора и работает успешно.
Чтобы избежать добавления ссылки System.Windows.Forms , вы можете использовать простой трюк, так называемое ожидание вращения, импортирующий System.Threading :
SpinWait.SpinUntil(() => false);
Это также прекрасно работает и состоит в основном из итератора while с условием отрицания, которое возвращается вышеприведенным лямбда-методом. Почему это не перегрузка процессора? Вы можете посмотреть исходный код здесь; в любом случае, он в основном ожидает некоторый цикл процессора, чтобы сохранить выполнение команд.
Вы также можете выбрать создание зацикливателя сообщений, который просматривает ожидающие сообщения и обрабатывает каждое из них, прежде чем перейти к следующей итерации:
[DebuggerHidden, DebuggerStepperBoundary, DebuggerNonUserCode, DllImport(«user32.dll», EntryPoint = «PeekMessage»)] public static extern int PeekMessage(out NativeMessage lpMsg, IntPtr hWnd, int wMsgFilterMin, int wMsgFilterMax, int wRemoveMsg); [DebuggerHidden, DebuggerStepperBoundary, DebuggerNonUserCode, DllImport(«user32.dll», EntryPoint = «GetMessage»)] public static extern int GetMessage(out NativeMessage lpMsg, IntPtr hWnd, int wMsgFilterMin, int wMsgFilterMax); [DebuggerHidden, DebuggerStepperBoundary, DebuggerNonUserCode, DllImport(«user32.dll», EntryPoint = «TranslateMessage»)] public static extern int TranslateMessage(ref NativeMessage lpMsg); [DebuggerHidden, DebuggerStepperBoundary, DebuggerNonUserCode, DllImport(«user32.dll», EntryPoint = «DispatchMessage»)] public static extern int DispatchMessage(ref NativeMessage lpMsg); [DebuggerHidden, DebuggerStepperBoundary, DebuggerNonUserCode] public static bool ProcessMessageOnce() < NativeMessage message = new NativeMessage(); if (!IsMessagePending(out message)) return true; if (GetMessage(out message, IntPtr.Zero, 0, 0) == -1) return true; Message frameworkMessage = new Message() < HWnd = message.handle, LParam = message.lParam, WParam = message.wParam, Msg = (int)message.msg >; if (Application.FilterMessage(ref frameworkMessage)) return true; TranslateMessage(ref message); DispatchMessage(ref message); return false; >
Тогда вы можете безопасно выполнить цикл, выполнив что-то вроде этого:
while (true) ProcessMessageOnce();
Еще лучше, если вы могли бы смешать два последних решения, заменив while итератор с SpinWait.SpinUntil вызова:
SpinWait.SpinUntil(ProcessMessageOnce);
Источник: overcoder.net
Задержка экрана консоли на C++
Итак, вы написали консольное приложение, компилятор построил его без ошибок, но после запуска программы окно приложения сразу закрывается, сейчас я расскажу как этого избежать.
Если вы пользуетесь Visual Studio 2008 или более ранней версией, Вам достаточно запускать программу из интерфейса компилятора с помощью нажатия клавиш Ctrl + F5.
Если Вы пользуетесь другим компилятором или хотите использовать Вашу программу вне компилятора, то возможны два способа создание задержки экрана. Первый — Прописать команду system(«pause»); в конце главной функции main, но перед оператором return, например:
#include // Для работы с функцией system() using namespace std; int main() < setlocale(0,»»); cout
Эта системный оператор командной строки Windows, также можно реализовать задержку экрана с помощью оператора getch();, но для этого необходимо подключить библиотеку conio.h, пример ниже:
#include // библиотека, необходимая для работы оператора getch(); using namespace std; int main() < setlocale(0,»»); cout
Вы можете применять любой из вышеприведенных способов, принципиальных отличий у них не наблюдается, все исходники в разделе C/C++ приведены без команды задержки экрана, так как были откомпилированы в среде Visual Studio 2008 и запускались из под ее интерфейса.
Источник: code-live.ru
Что делать, если после выполнения скрипта командная строка автоматически закрывается
Командная строка, будучи запущенной, закроется только тогда, когда пользователь нажмет кнопку завершения работы или выполнит в ней команду exit. Но бывает и такое, что после командная строка закрывается сама, не сообщая пользователю о результатах отработанного сценария и не сообщая о причинах закрытия. Как правило, с таким поведением консоли приходится сталкиваться при выполнении скриптов — CMD или BAT -файлов.
Это вполне нормально, но иногда нужно, чтобы после отработки такого скрипта консоль не закрывалась автоматически, а ждала ввода следующей команды.
Ну что же, понудить ее изменить свое поведения очень просто. Самый простой способ — это добавить в конец командного файла команду pause или специальный ключ, запускающую копию командной строки.
Главное, чтобы у вас имелись права на редактирование этого самого скрипта.
Отройте скрипт Блокнотом или любым другим текстовым редактором и добавьте в самый конец кода команду pause или cmd /k.
Это два разных способа и работают они по-разному.
Команда pause прерывает выполнение скрипта и выводит сообщение «Для продолжения нажмите любую клавишу…». Если команда добавлена в конец скрипта, при нажатии любой клавиши консоль будет закрыта, если же pause окажется в середине кода, после нажатия любой клавиши продолжится выполнение скрипта (следующих команд) .
Команда cmd /k работает несколько иначе.
Будучи добавлена в конец сценария, она как-бы перезапускает консоль, выводя стандартное приглашение ввести новую команду.
Если же добавить cmd /k в середину кода, его выполнение будет прервано и прекращено.
В этом основная разница между этими командами.
Тонкая настройка командной строки
Если нет желания возиться с каждым командным файлом, отредактируйте параметры работы самой командной строки.
Для этого открываем командой regedit редактор реестра и разворачиваем ветку:
HKCRbatfileshellopencommand
В правой колонке меняем значение параметра по умолчанию с «%1» %* на cmd.exe /k «%1» %*.
Тоже самое проделываем с параметром по умолчанию в ветке HKCRcmdfileshellopencommand , для командных файлов формата CMD .
Вот и всё, отныне командная строка будет закрываться только по решению юзера, если только в сценарий не прописана команда exit .
Источник: www.white-windows.ru