2009-08-06 5 views
-7

동료가 몇 년 동안 더 오랫동안 작업을 진행했음을 나타내는 맞춤형 AVI를 사용하고 있습니다. 항상 잘 작동합니다.테마가 설정된 Windows XP/Vista에서 TAnimate가 작동하지 않습니다.

최근 그는 델파이 7에서 델파이 2007로 옮겨 가기로 결정했는데 부분적으로는 자신의 응용 프로그램에 대한 테마 지원을 제공하기로 결정했습니다. (마침내 XP에서 실행되는 대부분의 사람들이 있지만 전부는 아닙니다.) 애니메이션이 작동을 멈췄습니다. 테마를 사용하지 않으면 다시 작동합니다.

TAnimate는 InitCommonControlsEx (ICC_ANIMATE_CLASS)를 사용하여 만든 Windows 애니메이션 컨트롤의 래퍼입니다. MSDN 설명서에는 "ComCtl32.dll 버전 6을 사용하는 경우 스레드가 지원되지 않으므로 응용 프로그램이 UI를 차단하지 않거나 애니메이션이 나타나지 않는지 확인하십시오." 분명히 이것은 의도 한 행동입니다.

이 문제의 대안이나 대안에 대한 제안 사항이 있습니까? 진행 상황을 보여 주려고하는 처리는 별도의 스레드를 생성하는 데 적합하지 않으며 Application.ProcessMessages는 좋은 해결책이 아닙니다.

EDIT : a)이 주제에 대한 Raymond Chen의 블로그 게시물에 "누락 된 링크"(말장난)를 제공했기 때문에 Rob Kennedy에게이 질문에 대한 정답을 부여했습니다. b) 별도의 실에 대한 적절한 대답이었습니다.

아이러니하게도 : TAnimate를 차단하는 작업은 우리가 사용하는 데이터베이스 엔진 (Advantage Database Server 또는 ADS)의 인덱싱 작업이었습니다. 그는 그가 저에게 문제를 제기했을 때 언급하지 않았습니다.

ADS는 TAdsDataSet.AdsRegisterCallbackFunction 및 TAdsDataSet.AdsClearCallbackFunction 메서드를 사용하여 진행 콜백을 지원합니다. 콜백 함수에는 현재 작업의 진행률 (백분율)과 함수의 반환 값을 사용하여 작업을 취소하는 방법이 모두 제공됩니다. 그래서 전체 질문은 논박의 여지가 있습니다. 콜백 함수는 앱이 멈추지 않았다는 것을 사용자에게 알려주는 진행 막대를 업데이트하는 데 사용할 수 있습니다.

+0

테마를 얻으려면 7에서 2007로 이동 하시겠습니까? Delphi 7에서는 이미 테마를 지원했지만 –

+0

나는 "부분적으로"말했습니다. D7은 실제로 주제를 지원했습니다. 그는 단지 눈치 채지 못했다. (그는 약간의 러 다이 트입니다.)

답변

5

Raymond Chen has written about this. 그는 일반적으로 스레드 컨트롤이 잘 작동하지 않는 주된 이유는 스레드가 다른 스레드와 연결된 창에 그려서는 안된다는 것입니다.

저는 동료가 작업을 별도의 스레드에 넣을 수 없다고 결정하게 만들었던 것이 무엇이든 다시 방문하도록 권장합니다. 비 반응성을 숨길 수있는 애니메이션 컨트롤이 있는지 여부에 관계없이 기본 UI 스레드를 차단하는 것은 좋지 않습니다.

+0

Rob, thanks. 나는 어딘가에서 뭔가를 보았다는 것을 알았지 만, MSDN 검색은 레이몬드의 기사를 제출하지 않았다. 그는 여전히 별도의 스레드가 유일한 솔루션이라고 생각하고 있습니다. 타사 DLL 호출에서 기다리고있는 것은 무엇이며, DLL 작업이 완료 될 때까지 응용 프로그램을 계속 진행해서는 안됩니다. 사용자가 프로세스가 진행되는 동안 일종의 활동 표시기를 표시하려고하므로 사용자는 앱이 정지되지 않았 음을 알게됩니다. –

1

TThreads 대신 기능적 관점에서 멀티 스레드 처리를 쉽게 시작할 수있는 AsyncCalls을 사용할 수 있습니다. 하지만이를 처리하는 가장 좋은 방법은 백그라운드에서 긴 프로세스를 수행하여 응용 프로그램을 응답 성있게 유지하는 것입니다.

관련 문제