2012-09-02 3 views
2

messagebox API에 문제가 있습니다. 나는 messageboxw를 사용하여 질문을한다. 예를 들어, 내 프로그램은 스레드 등으로 매우 분주합니다. 사용자가 메시지 상자를 표시하는 단추를 클릭하면 프로그램이 이전보다 사용량이 적을 때까지 메시지 상자가 표시되지 않습니다. 메시지 상자를 제거하면 코드가 잘 실행 된 후 제거됩니다. 나는 보여줄 코드가 너무 많지만 어쩌면 내가 돌봐야 할 것이있다. ...델파이의 메시지 박스 지연

아무도이 경험이 있었나요?

도움 주셔서 감사합니다.

답변

10

버튼을 클릭하면 메시지 대기열에 메시지가 게시됩니다. 다음 메시지 대기열을 펌프 할 때까지는 처리되지 않습니다. 따라서 버튼을 클릭 할 때와 프로그램이 응답하는 사이에 지연이있는 경우 메시지 대기열이 적시에 서비스되지 않기 때문입니다.

GUI 스레드가 사용 중이면 메인 스레드가 수행중인 작업이 완료 될 때까지 메시지 대기열이 펌핑되지 않습니다. 그리고 장기간의 작업이 있다면 GUI 쓰레드가 바쁠 것입니다. 대기 버튼 클릭 메시지가 결국 처리되면 MessageBoxW을 호출하면 대화 상자가 즉시 표시됩니다.

GUI 스레드가 실행되지 않는 또 다른 유일한 이유는 CPU가 우선 순위가 더 높은 스레드에서 소비되었다는 것입니다. 그러나 그것은 거의 일어나지 않을 것입니다. 응용 프로그램이 우선 순위가 높은 스레드를 사용하는 것은 매우 드문 경우입니다. 네가 그렇게한다면 놀랄거야.

어떻게 문제를 해결할 수 있습니까? 주 스레드에서 장기 실행 작업이있는 경우 해당 작업을 백그라운드 스레드로 이동하십시오. 또는 우선 순위가 높은 스레드에서 GUI 스레드 실행을 중지 한 경우 백그라운드 스레드를 보통 우선 순위로 실행하십시오.

+0

GUI 스레드에서 실행되지 않습니다. 그리고 말했듯이, 메시지 상자를 제거하면 잘 작동합니다. indy를 사용하고 바쁜 코드는 모두 OnExecute 프로 시저에서 실행됩니다. –

+3

GUI 스레드에서 실행되지 않는 것은 무엇입니까? 그런 다음 분명히 버튼입니다. 그리고 버튼 클릭이 즉시 처리되지 않으면 다른 곳에서 실행 중이어야 메시지 대기열이 적시에 서비스되지 않습니다. –

+0

그리고 내가 말했듯이. 메시지 상자를 완전히 놓친 경우 제대로 작동합니다. –