If you want to keep your application opened, you have to do something in order to keep its process alive. The below example is the simplest one, to be put at the end of your program:
while (true) ;
However, it’ll cause the CPU to overload, as it’s therefore forced to iterate infinitely.
At this point, you can opt to use System.Windows.Forms.Application
class (but it requires you to add System.Windows.Forms
reference):
Application.Run();
This doesn’t leak CPU and works successfully.
In order to avoid to add System.Windows.Forms
reference, you can use a simple trick, the so-called spin waiting, importing System.Threading
:
SpinWait.SpinUntil(() => false);
This also works perfectly, and it basically consists of a while
loop with a negated condition that is returned by the above lambda method. Why isn’t this overloading CPU? You can look at the source code here; anyway, it basically waits some CPU cycle before iterating over.
You can also create a message looper, which peeks the pending messages from the system and processes each of them before passing to the next iteration, as follows:
[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;
}
Then, you can loop safely by doing something like this:
while (true)
ProcessMessageOnce();
Those solutions mentioned change how your program work.
You can off course put #if DEBUG
and #endif
around the Console calls, but if you really want to prevent the window from closing only on your dev machine under Visual Studio or if VS isn’t running only if you explicitly configure it, and you don’t want the annoying 'Press any key to exit...'
when running from the command line, the way to go is to use the System.Diagnostics.Debugger
API’s.
If you only want that to work in DEBUG
, simply wrap this code in a [Conditional("DEBUG")] void BreakConditional()
method.
// Test some configuration option or another
bool launch;
var env = Environment.GetEnvironmentVariable("LAUNCH_DEBUGGER_IF_NOT_ATTACHED");
if (!bool.TryParse(env, out launch))
launch = false;
// Break either if a debugger is already attached, or if configured to launch
if (launch || Debugger.IsAttached) {
if (Debugger.IsAttached || Debugger.Launch())
Debugger.Break();
}
This also works to debug programs that need elevated privileges, or that need to be able to elevate themselves.
Очень часто новички сталкиваются с такой проблемой: запускают программу, а консоль закрывается после выполнения программы и не дает просмотреть результат ее работы. В этот статье мы поговорим о том, что нужно сделать, чтобы этого избежать.
Рассмотрим программу на языке C, которая выводит в консоль надпись «Hello world!»:
#include <stdio.h> int main () { printf(«Hello world!n»); return 0; } |
Запустим программу, для этого нажмем в Visual Studio клавишу F5. Консоль появляется и мгновенно исчезает. Существуют два пути решения этой проблемы.
Первый. Самый простой. Нажать одновременно клавиши Ctrl и F5. Смотрим результат:
Второй способ (которым почему-то пользуется большинство начинающих. Дописать в конце программы функцию, которая считывает символ с клавиатуры (_getch(), чтобы эта функция работала, подключаем библиотеку <conio.h>), тем самым программа ждет ввода символа и консоль не закрывается, а мы смотрим на результат ее работы.
#include <stdio.h> #include <conio.h> int main () { printf(«Hello world!n»); _getch(); return 0; } |
Теперь рассмотрим пример этой же программы на языке C#
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace consoleIsNotclosedCSharp { class Program { static void Main(string[] args) { Console.WriteLine(«Hello world!»); } } } |
Если выполнить запуск программы в Visual Studio, нажав F5, мы ничего не увидим: консоль быстро закроется. Поэтому необходимо нажимать одновременно Ctrl и F5, либо дописать функцию Console.ReadLine(), которая будет ожидать ввода строки:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace consoleIsNotclosedCSharp { class Program { static void Main(string[] args) { Console.WriteLine(«Hello world!»); Console.ReadLine(); } } } |
Запустив программу, мы увидим, что консоль не закрывается после выполнения программы, и теперь есть возможность прочитать выводимую фразу: «Hello world!». Нажав клавишу Enter, завершим программу.
Скачать исходники программ можно, нажав кнопку ниже.
Скачать исходники
ObjectOne > C++ > MVS 2012 > Visual Studio — Если консоль открывается и сразу закрывается
Странная штука, решил протестировать ещё одно приложенице но тут консолька стала чудить на секунду открываться и опять исчезать. Правильное решение было найдено в одном из вопросов по теме. Не дискредитируйте идеи консольного программирования не вставляйте функции а меняйте настройки среды разработки. Решение чуть ниже.
- Проект — Свойства
- Поменяйте настрйку подсистемы
TheCalligrapher
Программа «выключается» потому, что вы ее так и написали — выполняющейся без остановки и сразу завершающейся — и выполняете ее не из консоли.
Вставлять в консольное придложение всякие ‘cin.get()’ или ‘system(«pause»)’ — это грязное программироване и дискредитация идеи консольного приложения. Если вы пользуетесь Microsoft Visual Studio, то поставьте в установках проекта SUBSYSTEM=CONSOLE и запускайте свою программу без дебаггера (Ctrl+F5). Окно консоли не будет закрываться по завершению программы. Если же вы ползуетесь другой средой — смотрите документацию на тему того, как это делается там.
( http://www.cyberforum.ru/cpp-beginners/thread1672058.html )
Количество просмотров: 13 672
| Категория: MVS 2012
| Тэги: консоль
Господа, подниму тему, имхо возник специфический вопрос по данной теме, гугл выдает одно и тоже, но это не подходит.
В основном имеется 2 ответа по вопросу закрытия консоли:
1) Использовать вышеперечисленные методы. Минус — прописывать в каждом коде (реально достало)
2) Запускать через Ctrl
+F5
. Минусы — нет отладки, постоянно вываливается окно «Вывод».
Для C++ есть возможность настраивать через настройку проекта, для шарпа такой возможности не нашел.
Также есть упоминания про define
, но тут опять прописывать.
В идеале достичь такого эффекта: запускать проект через F5
, только в конце автоматически добавляется задержка, ждущая пользователя (типа ReadKey()
, соглашусь на текст «пауза, нажмите…»), без всяких вываливающихся окон. Реально ли такое сделать?