버튼을 클릭하면 메시지 대기열에 메시지가 게시됩니다. 다음 메시지 대기열을 펌프 할 때까지는 처리되지 않습니다. 따라서 버튼을 클릭 할 때와 프로그램이 응답하는 사이에 지연이있는 경우 메시지 대기열이 적시에 서비스되지 않기 때문입니다.
GUI 스레드가 사용 중이면 메인 스레드가 수행중인 작업이 완료 될 때까지 메시지 대기열이 펌핑되지 않습니다. 그리고 장기간의 작업이 있다면 GUI 쓰레드가 바쁠 것입니다. 대기 버튼 클릭 메시지가 결국 처리되면 MessageBoxW
을 호출하면 대화 상자가 즉시 표시됩니다.
GUI 스레드가 실행되지 않는 또 다른 유일한 이유는 CPU가 우선 순위가 더 높은 스레드에서 소비되었다는 것입니다. 그러나 그것은 거의 일어나지 않을 것입니다. 응용 프로그램이 우선 순위가 높은 스레드를 사용하는 것은 매우 드문 경우입니다. 네가 그렇게한다면 놀랄거야.
어떻게 문제를 해결할 수 있습니까? 주 스레드에서 장기 실행 작업이있는 경우 해당 작업을 백그라운드 스레드로 이동하십시오. 또는 우선 순위가 높은 스레드에서 GUI 스레드 실행을 중지 한 경우 백그라운드 스레드를 보통 우선 순위로 실행하십시오.
GUI 스레드에서 실행되지 않습니다. 그리고 말했듯이, 메시지 상자를 제거하면 잘 작동합니다. indy를 사용하고 바쁜 코드는 모두 OnExecute 프로 시저에서 실행됩니다. –
GUI 스레드에서 실행되지 않는 것은 무엇입니까? 그런 다음 분명히 버튼입니다. 그리고 버튼 클릭이 즉시 처리되지 않으면 다른 곳에서 실행 중이어야 메시지 대기열이 적시에 서비스되지 않습니다. –
그리고 내가 말했듯이. 메시지 상자를 완전히 놓친 경우 제대로 작동합니다. –