2009-11-23 73 views
4

我们有一些向控制台输出大量彩色文本的方法。缓存系统。控制台输出

它实际上是一个通过循环访问数据的菜单。

因为我们一个一个地写着项目(一行含有不同颜色的多个项目),所以这个过程在低端和中端机器上相当慢。在这些机器上,你可以看到每一行都被逐一写入,这对最终用户来说是相当令人沮丧的。

这个菜单必须显示很多次,所以我想知道我是否不能只是“缓存”这个输出。如果没有彩色文本,我只需将输出存储在一个字符串中并一次写入,但我不想丢失颜色信息。

有什么建议吗?

更新:只给输出是如何密集的一个想法: 更新2:更新马虎的代码,但还是要以某种方式缓冲输出。 MoveBufferArea被证明是一个部分解决方案(它产生不必要的滚动条)

DefaultBanner(); 

WriteLine("Available tests:\n", ConsoleColor.White); 

var methodNames = methods.Select(m => ((TestAttribute)m.GetCustomAttributes(false)[0]).Name).ToArray(); 

int vertical = 0; 
for (int i = 1; i <= methods.Length; i++) 
{ 
    if (i > methods.Length/2) 
    { 
     Console.SetCursorPosition(40, 4 + vertical++); 
    } 

    Write("("); 
    Write(i, ConsoleColor.Yellow); 
    WriteLine(") {0:00}", methodNames[i - 1]); 
} 

Write("\n("); 
Write(items.Count + 1, ConsoleColor.Yellow); 
Write(") Set address | ("); 
Write(items.Count + 2, ConsoleColor.Yellow); 
Write(") View Log | ("); 
Write(items.Count + 3, ConsoleColor.Yellow); 
Write(") Open Log directory \n("); 
Write(items.Count + 4, ConsoleColor.Yellow); 
Write(") Open configuration | ("); 
Write(items.Count + 5, ConsoleColor.Yellow); 
Write(") View current configuration | ("); 
Write(items.Count + 6, ConsoleColor.Yellow); 
WriteLine(") Quit"); 
Write("\nYour selection: "); 

int command = 0; 
while (!ConsoleReader<int>.TryReadValueInRange(1, items.Count + 6,out command)); 
return command; 

write方法是简单地封装了System.Console类的一些行为 辅助方法,所以我们也不会保持设定的颜色。

回答

1

我不知道你的项目是否可能,但有一种选择是使用某种标记语言来存储字符串本身的颜色,例如<yellow>Text in yellow</yellow>(或者你可以使用普通的CSS选择器,或者其他的)。这样你可以使用一个普通的字符串缓存。

顺便记住,.NET Framework已经实现了一个这样的缓存:请参阅String.InternString.IsInterned

+0

但即使我存储这个,我仍然不得不在每次写入控制台时切换颜色。构建这个字符串的过程并不占用太多时间。这是对Console.Write,Console的众多调用。WriteLine和Console.SetCursorPosition和Console.Foreground =一直占用的调用。 (PS:在你没有注意到的快速机器上) – TimothyP 2009-11-23 07:56:20

2

也许你可以巧妙地使用MoveBufferArea函数。那么如果你有一个当前对用户不可见的缓冲区的区域呢?您可以在那里创建缓冲区\菜单,然后将整个区域一次性复制到可见缓冲区的一部分。我不知道你对缓冲区的可见/不可见区域有多少控制,如果你可以像这样使用它们,这只是一个建议。

我能想到的唯一的其他选择是创建您自己的模拟控制台的控件。然后,您可以允许缓冲的读取/写入操作,或者在您做出多项更改后才刷新。但是这可能是很多额外的工作。

+0

我想我会试试这个方法...... – TimothyP 2009-11-24 00:37:38

+0

这种方法的缺点是它创建了滚动条,所以你可以滚动到“隐形”内容.... – TimothyP 2009-11-24 01:41:23

1

请记住,控制台是一个可配置的设备,这意味着你可以自己写(尽管我不推荐它)。有一种方法可以在配置文件中指定哪个类执行Tracing,哪个类执行Debug输出。

1

有没有办法让你的客户确定他们正在运行硬件加速的图形(检查驱动程序)?如果他们使用仅支持VGA的默认Microsoft驱动程序运行,则控制台将会非常慢。

+0

嘿不:-) 例如,在路上,我使用的索尼Vaio VGN-P21Z上网本,它确实很慢:p – TimothyP 2009-11-24 00:36:36

+0

您的评论并未说明您使用的是哪种图形驱动程序。 – GregC 2009-11-25 15:18:40

+0

http://downloadcenter.intel.com/SearchResult.aspx?lang=eng&ProductFamily=Graphics&ProductLine=Laptop+graphics+controllers&ProductProduct=Intel%C2%AE+Graphics+Media+Accelerator+500 – GregC 2009-11-25 15:21:08

2

有没有办法将属性评估逻辑“移出循环?”我怀疑这不是代码中最快的部分。

+0

我会检查这 – TimothyP 2009-11-25 06:01:34

+0

再次查看代码我意识到我真的放慢速度,每次都转换为数组...每次都会更新并重新测试。日Thnx – TimothyP 2009-11-25 06:09:29