2009-11-23 69 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