구성 요소 생성 또는 스트리밍 중에 손잡이를 사용해서는 안되는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/582721

문제

SDL_CreateWINDOW 기능을 통해 SDL 렌더링 표면을 감싸는 사용자 정의 VCL 컨트롤을 만들고 싶습니다. SDL_CREATEWINDOWFROM은 기존 HWND 핸들을 취하고 고성능 렌더링 컨텍스트 (DirectX 및 OpenGL을 포함한 여러 백엔드가 있음)를 제공합니다.

HelpFile은 "구성 요소 생성 또는 스트리밍 중에 핸들 속성을 언급하지 마십시오"라고 말합니다. 그러나 그것은 이유를 말하지 않습니다. 핸들 속성에 처음으로 액세스하려고 할 때 유효한 핸들이 존재하는지 확인하기 위해 핸들링을 호출한다고합니다.

그래서 두 가지 질문이 있습니다. 1 : 구성 요소 생성 중에 핸들 속성을 참조해서는 안되는 이유는 무엇입니까? 2. 제어의 전체 지점이 HWND를 초기화 해야하는 렌더링 표면을 래핑하는 것이라면, 생성/스트리밍 중에 (이상적으로) 발생 해야하는 초기화를 수행하는 것이 언제 안전합니까?

도움이 되었습니까?

해결책

핵심에서는 성능입니다. 스트리밍 프로세스 이후에도 일어날 수있는 다른 "나쁜"부작용이 있습니다. 상황은 "중간 건설"에 있으며 일반적으로 예상되는 모든 것은 아마도 그렇지 않을 것입니다.

"핸들"속성을 참조하면 핸들 생성 프로세스가 시작됩니다. 읽기 핸들이 실제로 Gethandle이라고 부르기 때문입니다. 스트리밍 프로세스에서 너무 빨리 수행하면 스트리밍 성능이 느리게 진행될 수 있습니다.

속성 세터 내에서 핸들을 올바르게 참조 해야하는 경우, 핸드 라이브로 배치를 확인하여 핸들이 생성되었는지 확인한 다음 참조해야합니다. setwindowlong () 또는 무언가를 호출하는 것과 같이 손잡이를 깃발을 변경 해야하는 경우, 구성 요소 인스턴스의 상태를 "캐시"한 다음 CreateWnd를 무시하고 해당 시점에서 해당 설정을 적용해야합니다. 또 다른 옵션은로드 된 가상 메소드가 호출 될 때까지 스트리밍하는 동안 (ComponentState에서 CSLOAD가 그때 CSLOWED 인 경우) 모든 핸들 액세스를 연기하는 것입니다.

마지막으로, 손잡이가 재현해야 할 경우를 알고 있어야합니다. 주변 양식 또는 상위 구성 요소의 핸들이 재생성 프로세스를 거치는 경우 발생할 수 있습니다. 최근 창문을 릴리스 할 때까지 일부 창 플래그를 변경하는 유일한 방법은 핸들을 파괴하고 CreateWindowEx () 호출에서 새 플래그로 재현하는 것이 었습니다. 여전히이 작업을 수행하는 많은 구성 요소가 있습니다. 당신은 당신이 확인하여 (ControlState에서 CSRECREATING) 상황에 처해 있는지 알고 있습니다.

따라서 질문에 직접 답변하기 위해 가장 좋은 곳은 CreateWND를 무시하고 그곳에서 일하는 것입니다. CreateWnd는 핸들이 생성 될 때만 호출됩니다. 올바르게 설계된 구성 요소는 표시되기 직전에 CreateWND를 한 번만 호출해야합니다.

다른 팁

두 번째 질문에 답하기 위해 : 귀하의 통제가 tcustomcontrol 아마도 무시해야합니다 CreateWindowHandle (). 이는 컨트롤을 위해 새 창 핸들이 생성 될 때마다 모든 초기화가 올바르게 반복된다는 이점이 있습니다. 이를 통해 창을 재현하지 않고 설정하거나 재설정 할 수없는 일부 창 스타일 플래그를 변경할 수 있습니다. 또한 핸들이 필요하지 않은 경우 핸들을 제거하고 나중에 재현하여 자원을 절약 할 수 있습니다.

이 질문도 참조하십시오 Whats-the-Difference-bet-ween-createwnd and createwindowhandle 그리고해야 할 일과시기에 대한 자세한 답변은 ...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top