2010-08-10 3 views
0

С #을 사용하여 Windows 응용 프로그램 양식 내에 콘솔 창을 포함했습니다._getch()와의 C# 콘솔 창 문제

콘솔 창에서 실행되는 응용 프로그램이 있습니다. 내 C# 프로젝트는이 출력을 표시하고 매개 변수를 보내기위한 GUI입니다.

내 GUI에서 콘솔 창으로 _getch() 호출을 할 때를 제외하고 대부분 잘 작동합니다. 전체 시스템을 정지시키는 경향이 있습니다.

누구에게 이런 일이 일어날 지 아이디어가 있습니까?

필요한 경우 코드를 게시 할 수 있습니다.

답변

0

_getch() 함수는 사용자가 키보드에서 타이핑 키를 누를 때까지 반환되지 않습니다. 이 함수가 프로그램의 주 스레드에서 호출되면 UI 스레드가 멈추게됩니다. 메시지 루프를 가동시키지 않아 UI가 더 이상 입력 이벤트를 처리하지 않거나 윈도우를 칠하지 않을 때 UI가 멈 춥니 다. 몇 초 후에 Windows는 제목 표시 줄에 "응답 없음"으로 유령 창을 둡니다.

백그라운드 스레드에서 _getch()를 호출하면 문제가 해결되지만 이는별로 도움이되지 않습니다. _kbhit()을 사용하여 키 스트로크를 사용할 수 있는지 확인할 수 있습니다. _kbhit()이 true를 반환 한 후에 _getch()를 호출하면 차단되지 않습니다. 아마 어느 쪽도 편리하지 않을 것입니다. _kbhit()가 false를 반환하는 동안 메시지 루프를 펌핑하려고하면 기술적 인 해결책이됩니다. 메시지 루프가 잘못된 코드에 저장되어 있지 않은 경우입니다.

콘솔 창에 Ctrl + S를 입력하면 출력이 일시 중지되고 Ctrl + Q를 누르면 다시 시작됩니다. UI 스레드는 여전히 차단되지만 최소한 사용자는 의도적으로 UI 스레드를 차단합니다.

+0

한스 패 탄트 (Hans Passant)의 훌륭한 정보 조각, 친절하게 답장을 보내 주셔서 감사합니다 :) – SnoopFroggyFrog

2

확율이 _getch()가 차단 호출입니다입니다 감사합니다.

+0

Windows 응용 프로그램 양식에서이 문제를 극복 할 수있는 방법을 알고 있습니까? – SnoopFroggyFrog

0

_getch()는 무엇을합니까? UI 스레드를 차단하는 경우 다른 스레드에서 호출을 시작할 수 있습니다.

+0

_getch()는 명령 프롬프트에서 키 입력을 읽습니다. 문제는 명령 프롬프트에 사용하기 위해 작성한 프로그램이 있습니다. 그것은 100 % 작동합니다. 하지만 Windows GUI 응용 프로그램 내에 명령 프롬프트를 포함시킴으로써 Visual Studio에서 설계 한 GUI를 통해이 도구를 사용하려고 할 때. 정지되지만 다른 모든 기능이 작동합니다. 그래서 어떻게 내 GUI 에서이 처리 할 수있는 아이디어? – SnoopFroggyFrog