2017-09-24 18 views
0

다시 그리기 영역, 플러그인/메시지 등의 정보를 전달하기위한 내부 메시지 큐가있는 Win32 콘솔 텍스트 편집기를 구현하고 있습니다. 기본적으로 단일 스레드가 선호됩니다 (아무 일도 일어나지 않는 경우). 추가 스레드가 필요함). 나는이 개 메시지 큐 구현 전략을 고려 중이 야 :텍스트 편집기에서 각 키 누르기를 한 스레드에서 다른 스레드로 전달할 수 있습니까?

  1. 를 사용하여 범용 대기열 및 Win32 이벤트를, 그래서 콘솔 입력 핸들 및 이벤트 핸들을 모두 통과, 동시에 내부 메시지 및 사용자 입력을 기다리는 WaitForMultipleObjectsEx를 사용할 수 있습니다. 이 경우, 텍스트 편집기는 단일 스레드 내에서 완전히 살아있을 수 있습니다.
  2. I/O 완료 포트를 사용하십시오. 이 경우 텍스트 편집기는 최소한 두 개의 스레드가 필요하며 그 중 하나는 GetQueuedCompletionStatus을 호출하여 메시지를 받고 다른 읽기 사용자는 PostQueuedCompletionStatus을 통해 대기열로 전송합니다. 콘솔 입력 핸들을 중첩 할 수없고 WaitFor* 함수가 완료 포트를 대기 핸들로 허용하지 않기 때문에 동시에 대기 할 수 없습니다. 첫 번째 설정 에서처럼 두 스레드는 입력 또는 이벤트가 없을 때 CPU 시간을 낭비하지 않지만 각 키 누르기는 IOCP를 통해 한 스레드에서 다른 스레드로 전달되어야합니다.

어느 디자인이 전반적으로 더 좋습니까?

텍스트 편집기에서 각 키 누르기를 IOCP를 통해 전달하는 데 성능 및 대기 시간의 단점이 있습니까?

+0

나는 Windows를 모르지만 매 초마다 몇 번의 키 누르기가 발생합니다. 컴퓨터는 빠릅니다. –

+0

스레드가 커널 모드에서 대기 중일지라도 무의미한 스레드가 있으면 메모리를 낭비하게됩니다. – Anders

+0

[Qt] (http://qt.io)와 같은 플랫폼 간 툴킷을 사용하는 것이 좋습니다. 그런 다음 툴킷이 제공하는 것을 –

답변

2

IOCP의 성능 및 대기 시간은 사용자의 목적에 따라 적절합니다. 그러나 각 키를 PostQueuedCompletionStatus로 변환하지는 않습니다. ReadQueueCompletionStatus를 사용하면 여러 번의 누름을 한 번에 대기열에 넣을 수 있습니다.

성능 차이는 최소한으로 생각합니다. 둘 중 하나는 환경에 따라 더 빠를 수 있습니다. WaitForMultipleObjects는 구현하기가 훨씬 쉽습니다.

P. 메시지 대기열이 필요하십니까? 이러한 재발송 요청/플러그인 메시지를 처리 ​​한 스레드에서 처리하지 않는 것이 좋습니다. 콘솔 (콘솔 출력 + 공유 상태)을 보호하기위한 중요한 섹션? 혼잡도가 100Hz 메시지 + 15Hz 키 누르기와 같이 낮 으면 속도를 빠르게 처리하므로 IOCP 나 다른 대기열에 비해 대기 시간이 훨씬 짧아집니다 : 혼잡도가 낮거나 잠긴 경우 중요 섹션이 전환되지 않습니다 잠금/잠금 해제를위한 커널. 이것은 또한 디자인을 단순화 할 것이고, 주 스레드는 ReadConsoleInput() 호출을 차단할 때 잠들 것이며, 그 전에는 기다릴 필요가 없습니다.

+0

답변 해 주셔서 감사합니다! 내가 제안한 동기식 메시징을 고려할 것이지만 적어도 일부 유형의 메시지에서는 훨씬 나아 보인다. 메시지 대기열 +'WaitFor * /'GetQueuedCompletionStatus'를 사용하는 이유는 Alertable I/O 또는 IOCP를 통해 주 스레드에서 I/O를 수행 할 수 있고, 모든 것이 완전히 재진입 할 ​​필요가 없기 때문입니다 (내 이해가 정확하다면) 모든 것이 제자리에서 부름을 받았다면. – jhkouy78reu9wx

+0

@ jhkouy78reu9wx IOCP는 완료 요청을 처리하는 다중 스레드가 있거나 MAXIMUM_WAIT_OBJECTS = 64 동시 스트림이있는 경우 경고 가능한 I/O보다 훨씬 낫습니다.스트림이 많지 않다면 WaitForMultipleObjects는 IOCP만큼 빠릅니다. async IO와 동일한 대기열에서 처리 콘솔 입력이 재미있을 수 있습니다. 사용자가 키를 ~ 최대 10Hz까지 누릅니다. 비동기 IO는 1KHz 이상의 속도로 완료 할 수 있지만 대기 시간은 사용자 입력의 우선 순위를 지정하려는 것입니다. WaitForMultipleObjects는 순서에 따라 핸들 우선 순위를 지정하기 위해 약간 더 좋습니다. – Soonts