다시 그리기 영역, 플러그인/메시지 등의 정보를 전달하기위한 내부 메시지 큐가있는 Win32 콘솔 텍스트 편집기를 구현하고 있습니다. 기본적으로 단일 스레드가 선호됩니다 (아무 일도 일어나지 않는 경우). 추가 스레드가 필요함). 나는이 개 메시지 큐 구현 전략을 고려 중이 야 :텍스트 편집기에서 각 키 누르기를 한 스레드에서 다른 스레드로 전달할 수 있습니까?
- 를 사용하여 범용 대기열 및 Win32 이벤트를, 그래서 콘솔 입력 핸들 및 이벤트 핸들을 모두 통과, 동시에 내부 메시지 및 사용자 입력을 기다리는
WaitForMultipleObjectsEx
를 사용할 수 있습니다. 이 경우, 텍스트 편집기는 단일 스레드 내에서 완전히 살아있을 수 있습니다. - I/O 완료 포트를 사용하십시오. 이 경우 텍스트 편집기는 최소한 두 개의 스레드가 필요하며 그 중 하나는
GetQueuedCompletionStatus
을 호출하여 메시지를 받고 다른 읽기 사용자는PostQueuedCompletionStatus
을 통해 대기열로 전송합니다. 콘솔 입력 핸들을 중첩 할 수없고WaitFor*
함수가 완료 포트를 대기 핸들로 허용하지 않기 때문에 동시에 대기 할 수 없습니다. 첫 번째 설정 에서처럼 두 스레드는 입력 또는 이벤트가 없을 때 CPU 시간을 낭비하지 않지만 각 키 누르기는 IOCP를 통해 한 스레드에서 다른 스레드로 전달되어야합니다.
어느 디자인이 전반적으로 더 좋습니까?
텍스트 편집기에서 각 키 누르기를 IOCP를 통해 전달하는 데 성능 및 대기 시간의 단점이 있습니까?
나는 Windows를 모르지만 매 초마다 몇 번의 키 누르기가 발생합니다. 컴퓨터는 빠릅니다. –
스레드가 커널 모드에서 대기 중일지라도 무의미한 스레드가 있으면 메모리를 낭비하게됩니다. – Anders
[Qt] (http://qt.io)와 같은 플랫폼 간 툴킷을 사용하는 것이 좋습니다. 그런 다음 툴킷이 제공하는 것을 –