cwinthread 예제
심각한 교착 상태에 빠질 수 있기 때문입니다. 토론 게시판 중 하나에 고전적인 예가 게시되었으며 작년에 나에게 일어난 일을 설명했습니다. 스레드를 시작한 다음 스레드가 완료될 때까지 기다리기로 결정하는 상황이 있습니다. 한편 스레드는 목록 상자에 무언가를 추가하거나 게시된 예제에서 FindWindow를 호출하는 등 무해한 작업을 수행합니다. 두 경우 모두 모든 스레드가 교착 상태에 빠지면서 프로세스가 중단되었습니다. 그런 다음 아래 코드는 “일시 중지”기능을 구현하는 방법을 보여줍니다. 또는 PauseEvent 변수는 큐 또는 다른 동기화 메커니즘에서 세마포를 나타낼 수 있습니다. 그러나 세마포, 종료 또는 일시 중지를 기다리려면 더 복잡합니다. 이 경우 이벤트의 “또는” 또는 “and”만 기다릴 수 있고 더 복잡한 관계가 아니기 때문에 세마포 또는 종료 조합에 대해 하나, 일시 중지 또는 종료 조합에 대해 두 개의 WaitForMultipleObjects를 중첩해야 할 수 있습니다.
아래에는 표시되지 않지만 이 기술을 시간 표시와 결합할 수 있습니다. 아래 예제에서 실행 플래그는 클래스 멤버 변수가 아니라 실제로 로컬이며 ShutdownEvent를 디코딩하는 사례에서 암시적으로 처리됩니다. 정말 기다릴 필요가 없었다 제공 (그리고 나는 거의 하지 않는 것을 발견), 나는 지금 잠재적으로 GUI를 잠글 수있는 메인 GUI 스레드에서 차단 동기화 이벤트를 도입 할 필요를 피했다. 또한 시작 중간인 경우에도 스레드를 취소할 수 있도록 Cancel 사례를 변경할 수 있으므로 스레드 계산의 컨텍스트에서 의미가 있습니다. 이 경우 시작 하는 동안 취소 플래그를 “폴링”해야 합니다., 예를 들어 시작 을 별도 함수로 분할 하 여: 문제는 작업자 스레드실행 될 때, 아마 당신이 하지 말아야 할 일이 많이 있다. 예를 들어 계산을 수행하기 위해 스레드를 시작합니다. 그런 다음 동일하거나 유사한 계산을 수행하는 두 개의 스레드가 있고, 그런 식으로 광기가 거짓말을합니다 (이것은 실제로 나쁜 일이라고 가정합니다). 대화 상자 또는 MessageBox가 완료될 때까지 스레드를 일시 중지해야 하는 경우 동기화를 위해 이벤트를 사용해야 할 수 있습니다. 예를 들어, 정리된 상태로 만들어지는 자동 재설정 이벤트를 만드는 것입니다. 사용자 정의 메시지(메시지 관리에 대한 내 문서 참조)를 기본 GUI 스레드에 게시하면 대화 상자가 시작됩니다. 대화 상자가 완료되면 ::SetEvent를 호출하여 이벤트를 설정합니다. 한편 스레드는 메시지를 게시한 후 ::WaitForSingleObject를 사용하여 이벤트가 설정될 때까지 기다립니다.