2011-01-27 2 views
1

내 WinForms 응용 프로그램에 단추가 있습니다. 이 버튼에는 단축키가 있습니다 (예 : Alt + L). 버튼이 눌려지면 처리가 끝날 때까지 더 이상의 버튼 클릭을 방지하기 위해 Click 이벤트를 처리하고 UI를 비활성화합니다. 그러나 키보드를 사용하여 액셀러레이터 키를 누르면 키 입력이 대기하고 UI가 다시 활성화되는 즉시 처리됩니다. 나는 이것을 원하지 않는다. 내 질문에 어떻게 지우기/플러시 키보드 버퍼 무엇입니까?오래된 메시지에서 키보드 버퍼를 지우는 방법

KeyPress 또는 KeyDown을 사용하여 이러한 문자를 먹는다면 수신시기를 알 수 없습니다. 나는 단지 첫 번째 Click 이벤트를 처리 할 때 도착한 오래된/부실 메시지 만 억제하려고합니다.

+0

버튼을 누르면 해당 버튼을 누르면 해당 키 스트로크가 푸시됩니다. 다시 활성화하기 전에 ['Application.DoEvents'] (http://msdn.microsoft.com/en-us/library/system.windows.forms.application.doevents.aspx)를 시도하십시오. –

+1

당신이하고있는 일은 사용자 인터페이스 스레드를 풀고 메시지 펌프를 계속 유지하기 위해 자신의 스레드에서 실행하고 싶을 수도 있습니다. Application.DoEvents가 도움이 될 수 있습니다. 하지만 다른 스레드도 좋은 생각처럼 보입니다. – madmik3

+1

@ madmik3 : 새 스레드 만들기에 동의했습니다. 'Application.DoEvents'는 다소 해킹입니다. 멀티 스레딩은보다 세련된 솔루션입니다. @ Jacob :하지만 먼저 UI 차단이 실제로 문제인지 확인해야합니다. 당신이 다른 모든 것을 올바르게하고 있다는 것은 질문에서 분명하지 않습니다. –

답변

3

예, 실제로 문제에 관한 이론은 위의 의견 교환에서 나 자신과 madmik3이 제안한 이론과 일치합니다. UI 스레드에서 응용 프로그램이 수행하는 작업량은 효과적으로 사용자가 키 입력을 포함한 다른 이벤트를 처리하는 것을 차단합니다. 그것들은 당신의 어플리케이션이 시간 소모적 인 포 그라운드 작업을 끝내면 나중에 실행을 위해 큐잉됩니다. 그것들은 현대의 선제 멀티 태스킹 OS의 위험입니다. 물론 실제 코드를 게시하지 않고서는 내가 경험 한 것보다 문제가 무엇인지 추측 할 수 있습니다.

실제로 이것이 사실인지 확인하는 빠른 확인은 처리 루프에 Application.DoEvents을 던지기위한 것입니다. 그러면 OS가 키 스트로크를 즉시 처리 할 수있게되며 버튼이 비활성화되어 모두 실패합니다. (Click 이벤트는 마우스 또는 키보드 바로 가기로 시작하여 Button 컨트롤의 경우 Enabled 속성이 "False"로 설정되어 있지 않은 경우 발생합니다.) "버퍼 플러시"와 가장 비슷합니다. 장기 실행 작업이 완료 될 때까지 KeyDown 또는 KeyPress 이벤트를 수신하는 것으로 의심됩니다.

문제가 해결되면 장기적인 해결책은 새 스레드를 생성하고 UI 스레드 대신 처리해야하는 모든 작업을 수행하는 것입니다. 이렇게하면 UI 스레드를 차단하지 못하며 Button 컨트롤이 올바르게 사용되지 않는다고 가정하면 "클릭하는"버튼을 클릭 할 수없는 상태에 있기 때문에 키 입력이 버려 질 수 있습니다. 새 스레드를 만드는 가장 간단한 방법은 BackgroundWorker component입니다. 문서에는 꽤 좋은 예가 들어 있습니다.