문제

콘솔의 매우 이상한 동작을 우연히 발견하면서 "리버스 콘솔"(서면 선이 바닥 대신 상단에 첨부 될 수 있도록)을 만들고있었습니다.

    static void Main()
    {
        for (var _linesWritten = 0; _linesWritten < 1000; _linesWritten++)
        {
            var _height = Math.Min(Console.BufferHeight-1, _linesWritten);
            Console.MoveBufferArea(0, 0, Console.BufferWidth, _height, 0, 1);
            Console.SetCursorPosition(0, 0);
            Console.WriteLine("Line {0} aaaaaaaaaa", _linesWritten);
            Console.ResetColor();
        }
    }

내가 그것을 고정 횟수로 부를 때 그것은 system.io.ioexception이 말합니다. 나는 그것이 움직이는 버퍼 영역의 양에 달려 있음을 알아 냈습니다. 콘솔을 변경하면서 예외 전에 작성된 줄의 수가 변경됩니다.

스크린 샷

나는 Windows 7 x64 @ corei7, 6GB ddr3을 실행하고 있습니다. 그래서 스토리지 shuld는 문제가되지 않습니다 .... 아무도 무엇이 잘못 될 수 있는지 단서가 있습니까?

도움이 되었습니까?

해결책

예외를 일으키는 API 함수는 readConsoLeOutput ()입니다. SDK 문서에는 관련 소형 인쇄가 있습니다.

lpbuffer :

콘솔 화면 버퍼에서 데이터를 읽는 데이터를 수신하는 대상 버퍼에 대한 포인터. 이 포인터는 dwbuffersize 매개 변수에 의해 크기가 지정되는 2 차원 char_info 구조의 원점으로 취급됩니다. 배열의 총 크기는이어야합니다 64K 미만.

나는 관련 문구를 굵게했다. 귀하의 프로그램은 200 줄 이상을 스크롤하려고 할 때 폭격됩니다 (201 x 80 x 4 = 64320 바이트, 65536에서 조금만 나옵니다). 그것은 콘솔의 버그 일 것입니다. movebufferarea (),이 제한을 확인하거나 쉽게 할 수있는 일을 시도하지 않습니다. Connect.microsoft.com에서 버그를보고 할 수 있습니다

지금은 버퍼 크기가 한계를 초과하지 않도록 라인 수를 제한해야합니다.

다른 팁

콘솔은 다른 창이 아닙니다. 실제로 양방향 입력, 쉘 레벨 리디렉션 등을 허용하기위한 것이며 이와 같은 일을하려고 할 때 이상한 문제가 발생할 수 있습니다. 이것은 주로 화면의 텍스트뿐만 아니라 파일 스트림 버퍼로 작업한다는 사실 때문입니다.

비표준 출력 스트림을 분명히하고 있기 때문에 "콘솔"정보를 호스팅하기위한 창을 만드는 것을 고려 했습니까? 콘솔 I/O를 자신의 스트림으로 리디렉션 할 수 있습니다 (다음은 vb.net 에서이 작업을 수행하는 샘플입니다), richtextbox와 같은 것을 사용하여 창에 직접 표시하십시오.

"Reversed"콘솔을 수행하는 경우 명령 줄 리디렉션 기능 또는 입력 메커니즘을 사용하지 않습니다.이 경우 사용자 정의 창은 아마도 더 좋은 접근 방식 일 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top