Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

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

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

Код:
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 Кб, 77 просмотров)

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

https://msdn.microsoft.com/en-us/lib...v=vs.110).aspx
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 11.07.2018, 09:36   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

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

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

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

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

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

Всем привет! Я только начинаю изучать 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, 15:56   #6
Мaкс
Форумчанин
 
Регистрация: 12.06.2018
Сообщений: 831
По умолчанию

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

Нашел ответ на свой вопрос. Меня эта тема зацепила, захотел разобраться до конца с таймерами и как с их помощью можно решить задачу. Тем более, что предложенный код с бесконечным циклом у меня при выполнении программы сильно подгружает процессор...
В общем, кому интересно, код ниже. Старался подробно описать в комментариях, что и для чего.
Код:
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, 07:55   #8
Мaкс
Форумчанин
 
Регистрация: 12.06.2018
Сообщений: 831
По умолчанию

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


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


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