QT가 내부적으로 이벤트를 처리하는 방법을 모르지만 가장 낮은 레벨의 대부분 시스템에서 응용 프로그램 수명이 이렇게 변합니다. 메인 스레드 코드는 기본적으로 루프입니다 (메시지 루프). 각 반복에서 응용 프로그램은 새 메시지를 제공하는 함수를 호출합니다. 대개 해당 기능이 차단되고 있습니다. 즉, 메시지가 없으면 기능이 반환되지 않고 애플리케이션이 중지됩니다.
함수가 반환 될 때마다 응용 프로그램에는 처리 할 새 메시지가 있습니다. 일반적으로받는 사람 (보낼 창), 의미 (메시지 코드, 예를 들어 마우스 포인터가 이동 됨) 및 일부 추가 데이터 (예 : 마우스가 좌표 24, 12 으로 이동되었습니다.).
이제 응용 프로그램에서 메시지를 처리해야합니다. OS 또는 GUI 툴킷은 보통 후드 아래에서 이것을 수행하므로 일부 검은 마법으로 메시지가 수신자에게 전달되고 올바른 이벤트 핸들러가 실행됩니다. 이벤트 처리기가 반환하면 이벤트 처리기를 호출 한 내부 함수가 반환되고 컨트롤을 주 루프로 되돌릴 때까지 호출 한 내부 함수가 반환되므로 이제는 다시 마법 메시지 검색 함수를 호출하여 또 다른 메시지. 이주기는 응용 프로그램이 종료 될 때까지 계속됩니다.
자 이제는 이벤트가 GUI 응용 프로그램에서 발생하는 이유는 수면 상태가 좋지 않음을 알기 위해이 모든 내용을 썼습니다. 메시지가 처리되는 동안 통지하면 메인 스레드가 실행 중입니다. 이벤트 핸들러는 결국 메시지 루프에 의해 호출되는 함수 일뿐입니다. 따라서 이벤트 핸들러를 잠자기 상태로 만들면 메시지 루프도 잠자기 상태가됩니다. 즉, 그 동안 응용 프로그램이 창을 다시 칠하는 메시지를 포함하여 다른 메시지를 수신하지 않고 처리하지 않으므로 응용 프로그램에서 " 사용자 관점에서 "중단"합니다.
짧은 이야기 : 매우 짧은 시간 (최대 수백 밀리 초) 동안 잠을 잘 때까지 잠을 자지 마십시오. 그렇지 않으면 GUI가 응답하지 않게됩니다. 수면을으로 바꿀 수있는 몇 가지 옵션이 있습니다. 타이머 (QTimer)를 사용할 수는 있지만 타이머 이벤트와 다른 이벤트 사이에 많은 부기가 필요할 수 있습니다. 보편적 인 대안은 분리 된 작업자 스레드를 시작하는 것입니다 : 그것은 UDP 통신을 처리 할 뿐이며, 주 스레드와 분리되어 필요에 따라 아무런 문제가 발생하지 않을 것입니다. 당연히 mutex로 스레드간에 공유되는 데이터를 보호하고 멀티 스레딩에서 발생하는 경쟁 조건 및 기타 모든 종류의 문제를 방지하도록주의해야합니다.
'sleep()'은 무엇을 위해 사용됩니까? –
UDP 패킷을 보내고 응답을 받기까지 지연으로 사용됩니다. –
이 QTime 솔루션은 자정에 실패하지 않습니까? –