2009-11-23 5 views
4

우리는 많은 색의 텍스트를 콘솔에 출력하는 몇 가지 방법을 가지고 있습니다.캐싱 System.Console 출력

실제로는 데이터 컬렉션을 반복하여 만들어지는 메뉴입니다.

우리가 항목을 쓰고 있고 (한 줄에 여러 가지 색상의 항목이 많이 포함되어 있기 때문에) 로우 엔드 및 미드 엔드 컴퓨터의 경우 다소 느립니다. 이 머신에서는 하나 하나 작성되는 각 행을 볼 수 있으며 최종 사용자에게는 오히려 실망 스럽습니다.

이 메뉴는 여러 번 표시되어야하므로 어떻게 든이 출력을 "캐시"할 수 없는지 궁금합니다. 색상이있는 텍스트가 없으면 단순히 출력을 문자열에 저장하고 한 번에 쓰면되지만 색상 정보는 잃고 싶지 않습니다.

제안 사항?

업데이트 : 업데이트 : 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 = 항상 사용하는 호출. (추신 : 빠른 기계에서는 전혀 알지 못합니다.) – TimothyP

2

어쩌면 MoveBufferArea 기능을 사용하여 뭔가 똑똑 할 수 있습니다. 현재 사용자가 볼 수없는 버퍼 영역이 있다면 어떨까요? 거기에 버퍼 \ 메뉴를 만든 다음 전체 영역을 보이는 버퍼의 일부로 한 번에 복사 할 수 있습니다. 나는 버퍼의 가시 영역/보이지 않는 영역에 대해 얼마나 많은 제어권을 가지고 있는지를 알지 못한다. 그리고 이것들을 사용할 수 있다면 그것은 단지 제안 일 뿐이다.

내가 생각할 수있는 유일한 다른 옵션은 콘솔을 모방 한 자체 컨트롤을 만드는 것입니다. 그런 다음 버퍼링 된 읽기/쓰기를 허용하거나 몇 가지 변경을 한 후에 새로 고침 만 할 수 있습니다. 그러나 이것은 많은 추가 작업이 될 수 있습니다.

+0

나는 이것을 시도해 볼 것입니다. – TimothyP

+0

이 방법의 단점은 스크롤바를 생성하여 "보이지 않는" 내용 .... – TimothyP

1

콘솔은 구성 가능한 장치이므로 직접 작성할 수는 있지만 (필자는 권장하지 않음) 유의하십시오. 어떤 클래스가 Tracing을 수행하고 어떤 클래스가 Debug 출력을 하는지를 설정 파일에 명시하는 방법이 있습니다.

1

클라이언트가 하드웨어 가속 그래픽을 실행하고 있는지 확인하는 방법이 있습니까 (드라이버 확인)? VGA 전용 기본 Microsoft 드라이버로 실행중인 경우 콘솔이 매우 느려질 수 있습니다.

+0

안녕하세요 아니요 :-) 예를 들어 도로에서 저는 실제로 매우 느린 Sony Vaio VGN-P21Z netbook을 사용하고 있습니다 : p – TimothyP

+0

귀하의 의견은 사용중인 그래픽 드라이버를 말하지 않습니다 . – GregC

+0

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

2

속성 평가 논리를 "루프 외부로 이동 하시겠습니까?" 나는 그것이 당신의 코드에서 가장 빠른 부분이 아닌 것으로 의심한다.

+0

나는 이것을 체크 할 것이다 – TimothyP

+0

코드를 다시 보면 나는 매번 배열로 변환함으로써 정말로 느려지는 것을 깨닫는다 ... 업데이트하고 다시 테스트 할 것이다. thnx – TimothyP