2012-07-17 4 views
0

나는 작업중인 다중 대화 상자 MFC 클라이언트 응용 프로그램이 있습니다. 이 클라이언트는 종종 작은 기능을 수행하는 주 대화 상자에 많은 메시징 (> 10Hz)을 수신 한 다음 처리를 위해 해당 메시지를 다른 대화 상자에 전달합니다.
나의 특별한 경우에, 주 대화 상자는 차량 위치와 관련된 메시지를 받고, 그 GUI에있는 몇 개의 필드를 업데이트 한 다음, PostMessage를 통해 모든 차량 정보를 표시하는 창으로 전달합니다.WindProc이 나를 위해 무엇을합니까?

기본적으로, 내 질문은 이것입니다 : 메시지를 게시하거나, 그냥 dialog.update (내가 만든 함수)를 호출하는 차이점은 무엇입니까?

답변

0

우리는 dialog.update()가 무엇을하는지 모르기 때문에 차이점을 어떻게 알 수 있습니까?

또 다른 PostMessage를하고 있다면, 그 점이 무엇인지 모르겠습니다. 프로그램은 새로 게시 된 메시지를 검색하기 위해 메시지 루프의 또 다른 반복을 기다려야하며, 아마도 다른 메시지가 게시되기 전에 수신 될 수 있습니다. PostMessage 대신 SendMessage를 사용하면 다른 메시지에 대한 메시지 루프를 반복하지 않고도 WndProc에 바로 메시지를 보낼 수 있습니다.

멀티 스레드라면 윈도우가 컨텍스트를 자동으로 전환해야하기 때문에 메시지를 보내거나 게시하는 것이 스레드로부터 안전하다고 생각합니다. 당신이 싱글 쓰레드라면, 그것은 중요하지 않을 것입니다.

+0

예 프로그램이 멀티 스레드입니다. 두 번째 windproc이 dialog.update()와 동일한 함수를 호출한다고 가정 해 보겠습니다. 게시물 메시지가 메시지를 보내고 업데이트가 완료 될 때까지 기다리지 않겠다고 말했지만, dialog.update()를 수행하면 업데이트가 완료 될 때까지 코드가 계속 실행되지 않습니다. 그럴까요? – Jason

+0

네, 기본적으로. PostMessge가 수행하는 작업은 모두 해당 창을 소유 한 스레드의 메시지 큐에 메시지를 넣은 다음 반환합니다. 창을 소유 한 스레드는 게시 한 메시지에 도달 할 때까지 메시지를 펌핑해야합니다. 그러나 SendMessage 할 경우 메시지는 즉시 창 WndProc로 이동하고 메시지가 처리 될 때까지 반환되지 않습니다. –

+0

그래서 3 가지 옵션 : 1) 메시지 게시, 2) 메시지 보내기, 3) Dialog.update(), 이것은 내가 가지고있는 것입니다 : 1) 즉시 게시하고 돌아갑니다. 메시지의 수신자가 메시지 처리를 위해 돌아갑니다. 2) 즉시 게시되지만 수신자가 완료되기 전에 완료 될 때까지 기다립니다. 3) 아니오와 동일. 2. 나는 그 권리를 읽고 있니? – Jason

0

귀하의 응용 프로그램이 멀티 스레드이고 해당 스레드 중 하나가 데이터를 수신하고 있으며 GUI 스레드와 다른 것으로 생각됩니다. SendMessage 또는 직접 호출이 아닌이 대화 상자의 다른 스레드에서만 PostMessage을 사용해야합니다.

메시지가 너무 많으면 개수 (5000 회) 또는 일부 시간 초과로 버퍼링해야합니다. 메시지를 vector, list 또는 원하는 컬렉션에 보관할 수 있습니다. 나중에 보낼 때이 컬렉션의 주소를 WPARAM (또는 LPARAM)으로 대화 상자에 게시하십시오. 대화 상자에서 한 묶음으로 처리하고 처리합니다. 이 접근 방식은 내가 아는 응용 프로그램의 다른 설계 인력에 대해 알지 못하기 때문에 올바르지 않을 수 있습니다.

실제 성능 및 안정성 이점을 얻으려면 시행 착오 접근이 필요합니다.

관련 문제