Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > .NET > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 11.07.2018, 08:56   #1
Мaкс
Форумчанин
 
Аватар для Мaкс
 
Регистрация: 12.06.2018
Адрес: Научная столица России.
Сообщений: 399
Репутация: -5
Вопрос Нужно обновлять строку, а не заново выводить!

Доброго времени суток! У меня вопрос: "Как обновлять строку, а не заново выводить!" Это мне нужно для простых часов, ну и на будущее.
Ниже будет скриншот, и там видно, что каждую секунду выводится новая строка с новой инфо, а я бы хотел, что бы вместо единственной строки выводилась новая инфо, реально ли это сделать?

Код:

using System;
class SimpleClock
{
    static void Main()
    {
        string t;
        int seconds;
        DateTime dt = DateTime.Now;
        seconds = dt.Second;
        for (; ; )
        {
            dt = DateTime.Now;
            // обновлять время через каждую секунду
            if (seconds != dt.Second)
            {
                seconds = dt.Second;
                t = dt.ToString("T");
                if (dt.Second == 0)
                    t = t + "\a"; // производить звонок через каждую минуту
                Console.WriteLine(t);
            }
        }
    }
}

Изображения
Тип файла: png Снимок.PNG (40.1 Кб, 39 просмотров)

Последний раз редактировалось Мaкс; 11.07.2018 в 09:01. Причина: Добавил скрин; Как я код забыл??
Мaкс вне форума   Ответить с цитированием
Старый 11.07.2018, 09:34   #2
Alex11223
Модератор
Заслуженный модератор
 
Регистрация: 12.01.2011
Сообщений: 16,844
Репутация: 3300

icq: 512-765
skype: alexp.frl
По умолчанию

https://msdn.microsoft.com/en-us/lib...v=vs.110).aspx
Alex11223 вне форума   Ответить с цитированием
Старый 11.07.2018, 10:36   #3
Serge_Bliznykov
МегаМодератор
СуперМодератор
 
Регистрация: 09.01.2008
Сообщений: 24,189
Репутация: 5256
По умолчанию

дополню ответ Alex11223

Вам нужно использовать метод Console.SetCursorPosition()

p.s. а вообще, консоль для подобных задач подходит плохо.
фактически консоль - это наследие "мрачных времён". Были времена, когда кроме консоли больше ничего не было. Весь вывод всех программ (кроме графических) был в этом консольном окне.

p.p.s. и бесконечный цикл - это моветон. Есть системный класс таймер, у него есть события, задайте интервал срабатывания и назначьте обработчик события, в нём и выводите что Вам нужно.
Serge_Bliznykov вне форума   Ответить с цитированием
Старый 11.07.2018, 10:47   #4
Мaкс
Форумчанин
 
Аватар для Мaкс
 
Регистрация: 12.06.2018
Адрес: Научная столица России.
Сообщений: 399
Репутация: -5
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
p.s. а вообще, консоль для подобных задач подходит плохо.
фактически консоль - это наследие "мрачных времён". Были времена, когда кроме консоли больше ничего не было. Весь вывод всех программ (кроме графических) был в этом консольном окне.
Это понятно.
Спасибо.
Мaкс вне форума   Ответить с цитированием
Старый 15.07.2018, 16:50   #5
Optimistic
Новичок
 
Регистрация: 15.03.2017
Сообщений: 2
Репутация: 10
По умолчанию

Всем привет! Я только начинаю изучать C#. Считаю написанный Максом код вполне пригодным. Благодаря ему подробнее изучил тему использование метода ToString и управляющие последовательности символов.
Если просто решить поставленный вопрос, то я изменил бы метод вывода строки WritLine на Write и добавил возврат каретки с помощью "\r" (это 21 строка кода).
Итоговый вариант кода:
Код:

using System;
class SimpleClock
{
    static void Main()
    {
        string t;
        int seconds;
        DateTime dt = DateTime.Now;
        seconds = dt.Second;
            for (; ; )
            {
                dt = DateTime.Now;
                // обновлять время через каждую секунду
                if (seconds != dt.Second)
                {
                    seconds = dt.Second;
                    t = dt.ToString("T");
                    if (dt.Second == 0)
                        t = t + "\a"; // производить звонок через каждую минуту
                    Console.Write("\r" + t);
                }
            }
        }
}

Просьба к тем, кто понимает, как можно использовать таймер для решения данной задачи, опубликовать здесь код, буду благодарен.
Также хотелось бы дополнить данное решение возможностью завершения программы при нажатии клавиши Escape.
Optimistic вне форума   Ответить с цитированием
Старый 15.07.2018, 16:56   #6
Мaкс
Форумчанин
 
Аватар для Мaкс
 
Регистрация: 12.06.2018
Адрес: Научная столица России.
Сообщений: 399
Репутация: -5
По умолчанию

Optimistic, это вариант, спасибо!
Мaкс вне форума   Ответить с цитированием
Старый 18.07.2018, 23:40   #7
Optimistic
Новичок
 
Регистрация: 15.03.2017
Сообщений: 2
Репутация: 10
По умолчанию

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

using System;
using System.Threading;

namespace MyTestCode
{
    class Program
    {
        // Создаем метод. 
        // Метод должен в качестве параметра принимать объект типа object.
        public static void TimerT(object obj)
        {
            Console.Write("\r {0}", DateTime.Now.ToString("T"));
        }
        static void Main()
        {
            // Устанавливаем метод обратного вызова
            // т.е. используем Делегат TimerCallback для вызова метода TimerT
            TimerCallback tm = new TimerCallback(TimerT);
            // Создаем таймер
            Timer timer = new Timer(tm, null, 0, 1000);
            //Console.ReadLine(); //завершаем программу при нажатии Enter
            // если закрывать через ESC, то можно так
            ConsoleKeyInfo keyN = Console.ReadKey();
            if (keyN.Key == ConsoleKey.Escape) return;

        }
    }
}

Я заметил, что есть задержка в несколько десятков миллисекунд, как ее избежать пока не знаю. Погрешность может накапливаться. Есть обсуждение умных дядек по этому вопросу... могу ссылочку, если будет интересно откопать.
Код не мой, нашел его в процессе изучения. Только немного подправил для варианта выхода из программы с помощью клавиши ESC.
Optimistic вне форума   Ответить с цитированием
Старый 19.07.2018, 08:55   #8
Мaкс
Форумчанин
 
Аватар для Мaкс
 
Регистрация: 12.06.2018
Адрес: Научная столица России.
Сообщений: 399
Репутация: -5
По умолчанию

Цитата:
Сообщение от Optimistic Посмотреть сообщение
Нашел ответ на свой вопрос. Меня эта тема зацепила, захотел разобраться до конца с таймерами и как с их помощью можно решить задачу.
Спасибо!
Мaкс вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите пожалуйста . Нужно сделать проверку (выходит ли введенный код в массив или нет, если нет то нужно заново запросить ввести код) Smile189 Общие вопросы Delphi 0 23.10.2016 21:56
Добавить файл и из его выводить в memo любую строку. misher Общие вопросы Delphi 9 06.02.2014 21:40
Json не хочет выводить строку. Abuhamed PHP 3 16.02.2011 23:05
Как выводить таблицы в строку по ширине Svetix HTML и CSS 2 30.04.2009 14:52
Для установки второго и последующих сайтов нужно заново покупать лицензию, Это реально? liberty HTML и CSS 10 14.10.2008 10:47


08:09.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru