2011-08-31 3 views
1

Visual Studio 2010 EnvDTE.OutputWindowPane에 진행 메시지를 쓰는 C# 코드가 있습니다. 이 코드는 VSPackage에있는 Visual Studio 메뉴에서 호출됩니다.Visual Studio 출력 창 새로 고침

문제는 메뉴 선택에 의해 호출 된 모든 처리가 완료 될 때까지 출력 창이 다시 그려지지 않으므로 각 줄을 추가 할 때가 아니라 한 번에 출력이 모두 나타납니다. 나는 이것이 주 스레드에서 수행되는 모든 처리와 관련이 있기 때문에 Visual Studio UI는 다시 칠할 수 없다고 생각합니다.

Visual Studio에서 Application.DoEvents() 같은 UI를 업데이트하는 "메시지 전달"방법이 있습니까? VSPackage는 또한 프로젝트의 일부 항목을 삽입하며 "즉시"발생하는 것으로 보입니다 - 지연되는 것만 나타나는 출력 창입니다.

이 기능에 대한 후보자를 찾지 못한 채 다양한 DTE 개체를 통해 철저히 조사했습니다.

+0

올바른 수정 사항은 UI 스레드에서 처리하지 않는 것 같습니다. – perelman

+0

그래, 계획은 작업 스레드로 처리를 이동하려고하는 것입니다,하지만 상당한 시간이 걸리고 나는 스레드 안전성의 일부 스레드 인터페이스 또는 스레드 친 화성이 있다면 걱정입니다. 알려진 안전한 지점에서 메시지를 펌핑하는 것이 덜 위험 해 보입니다. – UweBaemayr

+0

귀하의 문제가 혼란 스럽습니다. 모든 UI 변경 사항은 UI 스레드에서 발생해야합니다. 당신은'dispatcher = System.Windows.Threading.Dispatcher '를 기억함으로써이를 보장 할 수있다.CurrentDispatcher'를 UI 스레드의 코드에 저장 한 다음 나중에 다른 스레드에서 UI 변경 사항을 실행하기 위해'dispatcher'를 사용합니다. 메시지가 전송 된 순서대로 표시되도록하려면 약간의 허구가 있어야합니다. – perelman

답변

1

죄송합니다. 저는이 질문을 생각 나게하고 방금 답변을 드리겠습니다.

주 Visual Studio 스레드가 내 코드를 실행하고 UI를 업데이트하지 않는 동안 나타나는 진행률 표시 줄 창을 만들어 문제를 해결할 수있었습니다. 진행률 표시 줄 (IVsThreadedWaitDialog2)은 문서화가 잘되어 있지 않지만 작업자 스레드에서 실행되는 것처럼 보입니다. 활성 상태 일 때 Visual Studio를 모달 상태로 만듭니다. 최소한 Visual Studio는 처리 중에 매달아 보이는 것처럼 보이지 않습니다.

Visual Studio에서 큰 솔루션을로드 할 때 나타나는 진행 막대 창과 취소 단추 옵션이있는 것과 동일한 진행률 막대 창이 나타납니다.

불행히도, 진행률 표시 줄 대화 상자에는 Microsoft에보고 된 몇 가지 버그가 있습니다. 가장 중요한 점은 Visual Studio 창 뒤에 표시된다는 것입니다. 정말 짜증이납니다. 이는 일종의 쇼 스토퍼이므로 진행률 막대가 업데이트 될 때마다 코드 here의 변형을 사용하여 진행률 창의 제목을 찾아서 Visual Studio 창 스택 맨 위로 가져옵니다.

Visual Studio 편집기에서 텍스트를 조작하는 공유 코드를 실행하고 작업 결과가 엉망이었을 때 처리기 스레드로 처리를 옮기는 것이 잘 작동하지 않았습니다 (때로는 작동 할 수도 있고 가끔씩 불투명 한 COM 오류가 반환되었는데, 타이밍에 의존적 인 것으로 보임).

Visual Studio에서 마침내 메시지 펌프를 찾았습니다. 쉘에는 CommonMessagePump이라는 클래스가 있습니다. 다시 말하지만, 그것은 매우 잘 문서화되지 않았고, 나는 그것을 사용할 수있는 정보에 근거하여 결코 올바르게 작동시키지 못했습니다. 어쨌든 진행 상황 대화 상자가 내 문제를 해결했습니다.

1

필자의 경우 출력 창에 기록한 직후 System.Windows.Forms.Application.DoEvents()를 호출 할 수 있었고 문제가 해결되었습니다.