2012-05-25 2 views
2

У меня есть следующий код:Использование Console.WriteLine во Console.ReadLine

bool loop = true; 
     LongbowWorkerThread Worker = new LongbowWorkerThread(); 
     Thread w = new Thread(Worker.UpdateChannel); 
     w.Start(); 

     string inText = string.Empty; 

     while (loop) { 
      inText = Console.ReadLine(); 
      Console.WriteLine(inText); 
     } 

На данный момент рабочий поток просто повторяет строку, каждые 5000 мс. Проблема заключается в том, что печатная строка перекрывает уже введенный пользователем текст, что не является идеальным и выглядит довольно уродливым (хотя оно не влияет на фактические данные, возвращаемые Console.ReadLine.)

Есть ли способ предотвратить это перекрытие?

+1

«Есть ли способ предотвратить это перекрытие?» Да: самым простым было бы написать небольшой графический интерфейс. Это не должно занять много времени, это 2012 год, а не 1982 год, и у вас есть много интерфейсов пользовательского интерфейса внутри MONO на выбор. Вашим пользователям тоже понравится. – dasblinkenlight

+1

Не то, что я спросил. Я пишу быстро утилиту командной строки, просто для funsies и научить себя, как munge вокруг в textmode. Если вы не думаете, что я должен это делать, все в порядке - но если это так, найдите другого парня, который посоветует. ;) –

+1

@ sudowned «Не то, что я спросил». Вот почему я не ответил, просто прокомментировал. – dasblinkenlight

ответ

4

Вы можете использовать Console.CursorLeft и Console.CursorRight свойства отметить расположение курсоров, переместить его, вывод текста, а затем перенести его обратно.

Редактировать: Вот образец, который я просто сбросил вместе, хорошо работает, основываясь на 60 секундах тестирования, которые я бросил на него.

 int fooCursorTop = Console.CursorTop + 1; 

     var timer2 = new System.Timers.Timer(1000); 
     timer2.Elapsed += new System.Timers.ElapsedEventHandler(delegate 
      { 
       int tempCursorLeft = Console.CursorLeft; 
       int tempCursorTop = Console.CursorTop; 
       Console.CursorLeft = 0; 
       Console.CursorTop = fooCursorTop; 
       Console.WriteLine("Foo"); 
       Console.CursorLeft = tempCursorLeft; 
       Console.CursorTop = tempCursorTop; 
       fooCursorTop++; 
      }); 
     timer2.Start(); 

     string input = string.Empty; 
     while (input != "quit") 
     { 
      input = Console.ReadLine(); 
      Console.CursorTop = fooCursorTop; 
      Console.WriteLine(input); 
      fooCursorTop += 2; 
     } 
+0

Боюсь, что нет. Хотя в некоторых случаях это может быть использовано для предотвращения перезаписи содержимого ReadLine, это содержимое ** не следует курсору ** - они просто заброшены в другом месте на экране вместо того, чтобы перезаписываться. –

+0

@ sudowned Действительно? В этом случае вам, возможно, потребуется предоставить дополнительную информацию о том, что особенного в вашем сценарии, потому что вышеприведенный образец кода, который я только что редактировал, отлично работает. – Snixtor

+0

Не уверен, что в моем сценарии нет ничего особенного! По-видимому, ваше решение частично работает в этом случае, но оно вернет курсор к началу строки, но я также не вижу, чтобы какие-либо строки «Foo» действительно записывались. Я начинаю испытывать тревогу - может быть, это какая-то странная проблема с Mono, которая вообще не влияет на .NET? Не могли бы вы поделиться всем сценарием, включая объявления классов и так далее? –

0

Вы пытались использовать Console.Out.Flush() после Console.WriteLine()? Он должен передавать данные из буфера в выходной поток.

+0

Пробовал, не повезло. Кажется, что он не имеет никакого результата. –

-2

Вы пытались использовать «Environment.NewLine»? Это может быть полезным и может помочь вам сохранить портативность - http://www.dotnetperls.com/newline

+0

Вы прочитали вопрос? – Morti

Смежные вопросы