2010-07-26 5 views
1

현재 멀티 쓰레드 델파이 6 프로 어플리케이션을 사용하고 있습니다. 주 스레드 (VCL 스레드)의 컨텍스트에서 실행되는 코드에 중단 점을 설정하면 아무런 문제가 없습니다. 그러나 중단 점이 다른 스레드 중 하나의 코드에서 트리거되면 중단 점에서 응용 프로그램을 계속 한 후에 주 양식 (주 양식 포함)의 VCL 구성 요소에 대한 모든 다시 페인팅이 더 이상 발생하지 않습니다. 다른 배경 코드가 계속 실행되기 때문에 응용 프로그램은 죽지 않습니다. 단지 주 스레드입니다. 이는 Windows 메시지 디스패처가 손상되었거나 휴면 상태로 렌더링 된 것과 같습니다.델파이 6 : non-VCL 쓰레드 멈춤에서 멈춘 breakpoint 메인 쓰레드 다시 칠함

참고 :이 응용 프로그램에서는 등록 된 특정 메시지를 catch해야하기 때문에이 응용 프로그램에서는 주 양식에 allocateHwnd()를 통해 내 WndProc()를 할당합니다. 해당 WndProc()에서 처리하는 모든 사용자 지정 메시지를 디스패치하고 현재 메시지가 내 코드에 의해 처리되지 않으면 기본 폼의 상속 된 WndProc()를 호출하여 메시지를 전달합니다. 현재 메시지를 처리하면 Msg.Result가 1로 설정된 WndProc()에서 반환되어 메시지가 처리되었음을 디스패처에 알립니다. Delphi VCL이 Windows API RegisterWindowMessage() 호출로 인스턴스화 된 등록 된 메시지를 통과하지 못하기 때문에 단순히 WndProc()을 할당하는 대신 TForm WndProc()을 재정의 할 수 없습니다.

아무도 비슷한 맥락에서 이것을 경험 한 사람이 있습니까? 그렇다면 그것을 수정하기 위해 무엇을 했습니까?

- roscherl 당신은 당신이 다른 창을 을 만들었습니다 즉, AllocateHWnd를 호출하기 때문에

+0

재정의 된 WndProc에서 Windows 메시지를 처리하는 데 문제가 발생하지 않았습니다. 어쩌면 코드 샘플이 잘못되었는지 확인하는 데 도움이 될 것입니다. – kludg

+0

내 생각은 창을 실제로 덮어서 숨기지 않고 창을 새로 고치는 것이 아닌지 확인하는 것입니다. 윈도우가 업데이트가 필요하다는 것을 모를 수도 있습니다. – mj2008

+0

수정 사항이 아니지만 업데이트/페인트/새로 고침을 수행하면 어떻게됩니까? –

답변

2

. 해당 창으로 전달 된 메시지를 가져 와서 양식의 창으로 전달하면 안됩니다. 그 일을하는 동안, 정확히 어떻게 할 지 모르겠지만, 프로그램에서 문제를 일으킬 수 밖에 없습니다. 회화 문제는 그럴듯하게 들립니다. 당신은 그것이 정말로 단지 그림을 그리는 것이지, 당신의 메인 스레드가 여전히 정지되지는 않았는지 확인해야합니다. 디버거가이를 알려줄 것입니다. (DefWindowProc을 호출하여 할당 된 창에서 처리 할 준비가되지 않은 메시지를 처리해야하며 1을 반환해도 발송자에게 아무 것도 알리지 않으며 발송자는 걱정하지 않습니다. SendMessage은 결과를 알고 싶어합니다.)

양식이 등록 된 창 메시지를 완전히 수신 할 수 있다고 약속드립니다. WndProc을 재정의하거나 WindowProc 속성에 새 값을 할당하십시오 (이전 값을 저장해야 자신의 메시지를 처리 ​​한 후 호출 할 수 있음). 문제의 원인은 다른 곳에 있습니다.

+0

감사합니다 롭, 당신이 좋은 지적입니다.등록 된 메시지에 관해서, 나는 폼의 WndProc()를 하위 클래스로 되 돌리는 것과 같은 테스트를 두 번 반복했다. 등록 된 메시지는 절대로 표시되지 않지만 항상 allocateHwnd()를 사용하여 설정 한 WndProc()를 통해 수행됩니다. 나는 그 밖의 무엇을 말하거나 시도 할 지 모른다. –

+0

아마도 폼의 Handle 속성을 저장하고 그 동안 폼이 해당 창을 다시 만들었을 것입니다. 그런 다음 부실 창 핸들을 들고있을 수 있으므로 등록 된 메시지를 보내거나 게시 할 수 있습니다. –

0

업데이트 : 문제를 극복하는 방법은 좋은 해결책이라고 말하지 않습니다. Rob Kennedy의 노트를 가지고 리팩토링을해야합니다. 그러나 지금 문제를 지나치게하려면 스레드 자체의 Window 및 WndProc() 및 스레드 맨 위에 Execute 루프를주었습니다. TranslateMessage() 및 DispatchMessage()에 대한 호출과 함께 PeekMessage() 루프가 있습니다. 스레드에서 중단 점을 설정하는 데 더 이상 문제가 없지만 분명히이 WndProc() 메서드를 조합하면 코드에 구조적 문제가 있음을 알 수 있습니다. 이 답장을 추가하여 토론을 작성하고 싶습니다. 관련 폼, 특히 메인 폼에서 내 WndProc() 메서드를 정리할 때 Rob의 제안을 한 번 수행하면,이 스레드에 추가 한 새로운 WndProc()를 제거 할 수 있기를 바랍니다.

로버트.