Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Запуск консольной програмы  [new]
jenya7
Member

Откуда:
Сообщений: 1381
Есть програма
 private static void ConsoleMain(string[] args)
 {
     if (!int.TryParse(args[2], out int output_mask))
     {
           Console.WriteLine("Invalid argument 2.");
           return;
    }

    //set outputs according the mask
    for (i = 0; i < io_count; i++)
    {
        if ((output_mask & (1 << i)) > 0)
            digital_outputs[i].State = true;
        else
           digital_outputs[i].State = false;
    }
         
    Console.ReadKey();

}

в конце есть Console.ReadKey(); то есть програма должна остановиться и ждать нажатия клавиши. но когда я запускаю её консоль появляется и выходит.
21 апр 21, 11:42    [22311843]     Ответить | Цитировать Сообщить модератору
 Re: Запуск консольной програмы  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 22390
jenya7
програма должна
jenya7
return
не должна
21 апр 21, 11:44    [22311845]     Ответить | Цитировать Сообщить модератору
 Re: Запуск консольной програмы  [new]
jenya7
Member

Откуда:
Сообщений: 1381
Shocker.Pro
jenya7
програма должна
jenya7
return
не должна

откуда return?
я запускаю так
static string SendCommand(string exe_name, string args)
        {
            /* Create a new process object*/
            Process proc = new Process();
            /* StartInfo contains the startup information of the new process */
            proc.StartInfo.FileName = exe_name;
            proc.StartInfo.Arguments = args;
            /* These two optional flags ensure that no DOS window appears */
            proc.StartInfo.UseShellExecute = false;
            proc.StartInfo.CreateNoWindow = true;
            /* This ensures that you get the output from the DOS application */
            proc.StartInfo.RedirectStandardOutput = true;
            try
            {
                // Start the process
                proc.Start();
                // Wait that the process exits
                proc.WaitForExit();
                // Now read the output of the DOS application 
                return proc.StandardOutput.ReadToEnd().ToString();
            }
            catch (Exception ex)
            {
                return "Error: " + ex.Message;
            }
        }
21 апр 21, 11:46    [22311847]     Ответить | Цитировать Сообщить модератору
 Re: Запуск консольной програмы  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 22390
jenya7
откуда return?
В смысле? Из твоего же кода. Выполнение доходит до return и завершается, никакого ReadKey там нет
21 апр 21, 12:09    [22311859]     Ответить | Цитировать Сообщить модератору
 Re: Запуск консольной програмы  [new]
fkthat
Member

Откуда:
Сообщений: 4880
Никак не пойму - с какой целью тебе там ждать нажатия кнопки? И что за кейс вообще ты пытаешься решить?
21 апр 21, 12:12    [22311861]     Ответить | Цитировать Сообщить модератору
 Re: Запуск консольной програмы  [new]
jenya7
Member

Откуда:
Сообщений: 1381
Shocker.Pro
jenya7
откуда return?
В смысле? Из твоего же кода. Выполнение доходит до return и завершается, никакого ReadKey там нет


return только если условие int.TryParse не выполнилось. но оно выполняется и я вижу лампочки зажигаются по маске
for (i = 0; i < io_count; i++)
    {
        if ((output_mask & (1 << i)) > 0)
            digital_outputs[i].State = true;
        else
           digital_outputs[i].State = false;
    }


а проблема такая - dll устроен так что при удалении объекта digital_outputs - все выходы переходят в состояние off - лампочки гаснут.
ну вышла програма и вышла и хорошо. но лампочки остались гореть - значит объект digital_outputs остался в памяти?
что интересно - если убрать - Console.ReadKey(); - лампочки гаснут - то есть объект digital_outputs удаляется.
не могу понять что происходит.
21 апр 21, 12:21    [22311866]     Ответить | Цитировать Сообщить модератору
 Re: Запуск консольной програмы  [new]
jenya7
Member

Откуда:
Сообщений: 1381
тут полная версия. виден visibility scope объекта digital_outputs.

К сообщению приложен файл (Program.cs - 5Kb) cкачать
21 апр 21, 12:48    [22311884]     Ответить | Цитировать Сообщить модератору
 Re: Запуск консольной програмы  [new]
Dima T
Member

Откуда:
Сообщений: 15803
Сделай
     if (!int.TryParse(args[2], out int output_mask))
     {
           Console.WriteLine("Invalid argument 2.");
    Console.ReadKey();
           return;
    }
21 апр 21, 17:21    [22312063]     Ответить | Цитировать Сообщить модератору
 Re: Запуск консольной програмы  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 4207
ни когда так не делай, тем более с консольными программы. Если нужна пауза в инструментах консоли полно способов, как это сделать.
начиная Pause и заканчивая всякими выкрутасами в PS.
консольная программа по возможности, не должна ожидать какого либо ввода. Весь ввод, всяких параметров, обычно делают в сценарии выполнения, а не в программе (в sh или bat\ps1 файле).
21 апр 21, 18:47    [22312112]     Ответить | Цитировать Сообщить модератору
 Re: Запуск консольной програмы  [new]
Cat2
Member

Откуда: Petroskoi, Karjala
Сообщений: 145753
fkthat
Никак не пойму - с какой целью тебе там ждать нажатия кнопки? И что за кейс вообще ты пытаешься решить?

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

Сообщение было отредактировано: 21 апр 21, 23:07
21 апр 21, 23:12    [22312187]     Ответить | Цитировать Сообщить модератору
 Re: Запуск консольной програмы  [new]
jenya7
Member

Откуда:
Сообщений: 1381
я не пойму почему объект digital_outputs остается при выходе из програмы если в конце присутствует Console.ReadKey();
без Console.ReadKey(); лампочки гаснут, значит digital_outputs удалился.
22 апр 21, 08:34    [22312233]     Ответить | Цитировать Сообщить модератору
 Re: Запуск консольной програмы  [new]
Dima T
Member

Откуда:
Сообщений: 15803
jenya7
я не пойму почему объект digital_outputs остается при выходе из програмы если в конце присутствует Console.ReadKey();
без Console.ReadKey(); лампочки гаснут, значит digital_outputs удалился.

Наверно потому что в C# не деструктор, а финализатор, который вызывается не в момент удаления объекта, а позднее при очередной сборке мусора или завершении программы.

https://docs.microsoft.com/ru-ru/dotnet/csharp/programming-guide/classes-and-structs/destructors
22 апр 21, 08:47    [22312236]     Ответить | Цитировать Сообщить модератору
 Re: Запуск консольной програмы  [new]
jenya7
Member

Откуда:
Сообщений: 1381
Dima T
jenya7
я не пойму почему объект digital_outputs остается при выходе из програмы если в конце присутствует Console.ReadKey();
без Console.ReadKey(); лампочки гаснут, значит digital_outputs удалился.

Наверно потому что в C# не деструктор, а финализатор, который вызывается не в момент удаления объекта, а позднее при очередной сборке мусора или завершении программы.

https://docs.microsoft.com/ru-ru/dotnet/csharp/programming-guide/classes-and-structs/destructors

я запускаю скажем 10-20 консольных програм. я могу потом вызвать garbage collector и удалить оставшиеся объекты если есть такие?
22 апр 21, 09:33    [22312253]     Ответить | Цитировать Сообщить модератору
 Re: Запуск консольной програмы  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 22390
jenya7
я запускаю скажем 10-20 консольных програм. я могу потом вызвать garbage collector и удалить оставшиеся объекты если есть такие?
Ты же запускаешь их в отдельных процессах, судя по коду
22 апр 21, 09:38    [22312256]     Ответить | Цитировать Сообщить модератору
 Re: Запуск консольной програмы  [new]
Dima T
Member

Откуда:
Сообщений: 15803
jenya7
Dima T
пропущено...

Наверно потому что в C# не деструктор, а финализатор, который вызывается не в момент удаления объекта, а позднее при очередной сборке мусора или завершении программы.

https://docs.microsoft.com/ru-ru/dotnet/csharp/programming-guide/classes-and-structs/destructors

я запускаю скажем 10-20 консольных програм. я могу потом вызвать garbage collector и удалить оставшиеся объекты если есть такие?

Принудительная сборка мусора GC.Collect()

Но по-хорошему надо в своем классе прописывать интерфейс IDisposable и использовать оператор using

PS Это почитай

Сообщение было отредактировано: 22 апр 21, 09:38
22 апр 21, 09:44    [22312260]     Ответить | Цитировать Сообщить модератору
 Re: Запуск консольной програмы  [new]
jenya7
Member

Откуда:
Сообщений: 1381
Shocker.Pro
jenya7
я запускаю скажем 10-20 консольных програм. я могу потом вызвать garbage collector и удалить оставшиеся объекты если есть такие?
Ты же запускаешь их в отдельных процессах, судя по коду

ну да. нельзя потом вызвать garbage collector и удалить оставшиеся объекты?
22 апр 21, 09:44    [22312261]     Ответить | Цитировать Сообщить модератору
 Re: Запуск консольной програмы  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 22390
jenya7
ну да. нельзя потом вызвать garbage collector
чей?
22 апр 21, 09:46    [22312263]     Ответить | Цитировать Сообщить модератору
 Re: Запуск консольной програмы  [new]
jenya7
Member

Откуда:
Сообщений: 1381
Dima T
jenya7
пропущено...

я запускаю скажем 10-20 консольных програм. я могу потом вызвать garbage collector и удалить оставшиеся объекты если есть такие?

Принудительная сборка мусора GC.Collect()

Но по-хорошему надо в своем классе прописывать интерфейс IDisposable и использовать оператор using


но это в данной программе. а как мне собрать мусор других запущенных програм?
22 апр 21, 09:46    [22312265]     Ответить | Цитировать Сообщить модератору
 Re: Запуск консольной програмы  [new]
jenya7
Member

Откуда:
Сообщений: 1381
Shocker.Pro
jenya7
ну да. нельзя потом вызвать garbage collector
чей?

а что garbage collector вызывается на уровне бегущей програмы? я думал фреймворк умеет запускать его глобально и собирать весь мусор.
22 апр 21, 09:48    [22312268]     Ответить | Цитировать Сообщить модератору
 Re: Запуск консольной програмы  [new]
Dima T
Member

Откуда:
Сообщений: 15803
jenya7
но это в данной программе. а как мне собрать мусор других запущенных програм?

Никак. Каждая собирает только у себя. Читай про IDisposable и using
22 апр 21, 09:49    [22312269]     Ответить | Цитировать Сообщить модератору
 Re: Запуск консольной програмы  [new]
jenya7
Member

Откуда:
Сообщений: 1381
Dima T
jenya7
но это в данной программе. а как мне собрать мусор других запущенных програм?

Никак. Каждая собирает только у себя. Читай про IDisposable и using

печалька. тогда у меня проблема.
22 апр 21, 09:55    [22312274]     Ответить | Цитировать Сообщить модератору
 Re: Запуск консольной програмы  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 22390
jenya7
а что garbage collector вызывается на уровне бегущей програмы? я думал фреймворк умеет запускать его глобально и собирать весь мусор.
А с чего вдруг твоя консольная программа должна лезть и собирать мусор, скажем, в ASP.NET-сайтах, крутящихся на этой же машине? Не говоря о том, сколько времени займет такое действие. Логика?
22 апр 21, 09:57    [22312277]     Ответить | Цитировать Сообщить модератору
 Re: Запуск консольной програмы  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 22390
jenya7
печалька. тогда у меня проблема.
Что мешает убрать все ссылки и собрать мусор до Console.ReadKey?
22 апр 21, 10:01    [22312281]     Ответить | Цитировать Сообщить модератору
 Re: Запуск консольной програмы  [new]
Dima T
Member

Откуда:
Сообщений: 15803
jenya7
Dima T
пропущено...

Никак. Каждая собирает только у себя. Читай про IDisposable и using

печалька. тогда у меня проблема.

Нет тут никаких проблем, читать будешь? IDisposable как раз для того и придумано чтобы освобождать ресурсы сразу как они стали ненужны, т.е. аналог деструктора в С++. Тут подробнее.

Если ты это реализуешь как положено, то во всех твоих прогах ресурсы будут освобождаться не дожидаясь сборки мусора.
22 апр 21, 10:01    [22312282]     Ответить | Цитировать Сообщить модератору
 Re: Запуск консольной програмы  [new]
jenya7
Member

Откуда:
Сообщений: 1381
Shocker.Pro
jenya7
печалька. тогда у меня проблема.
Что мешает убрать все ссылки и собрать мусор до Console.ReadKey?

в том то и дело что из за кривизны dll мне как раз нужно чтоб объекты оставались после прогона консоли. но когда мой движок прогонит весь сиквенс - в конце - я хочу удалить весь мусор.
22 апр 21, 10:10    [22312291]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / WinForms, .Net Framework Ответить