2013-03-15 2 views
0

aviCopyFiles를 사용하도록 TAnimate 구성 요소를 설정 한 간단한 VCL 양식이 있습니다. 양식에 ShellAnimations가 포함되어 Windows 7에서 작동합니다.ProcessMessages를 사용하지 않고 TAnimate를 다시 그리는 방법

양식을 활성화하면 TAnimate를 활성화 한 다음 업데이트 프로세스의 일부로 LZCopy를 사용하여 파일을 복사하기 시작합니다.

하지만 TAnimate 이미지는 Application.ProcessMessages를 호출 할 경우에만 변경된다는 점을 알아 냈습니다. 자체 스레드 (Timers 속성은 false 임)에 있어야한다고해도 말입니다.

루프에서 업데이트 된 파일을 복사하는 동안 원활하게 애니메이션이 적용되도록하려면 어떻게해야합니까?

답변

3

마음을 바꾸십시오!

응용 프로그램의 기본 스레드는 UI를 유지하고 운영 체제에 응답하기위한 것입니다 (예 : 메시지 큐 서비스 및 수신 된 메시지에 적절하게 응답).

그런 식으로 생각하면 주 스레드가 작동하는 동안 작동하는 TAnimate이 필요하지 않다는 것을 알게 될 것입니다. 필요한 것은 무거운 작업을 다른 스레드로 이동시켜 응답 성있는 주 스레드를 만드는 것입니다. 다른 스레드에를 업데이트 된 파일을 복사 할 루프를 이동 귀하의 경우에는

, 당신은 TAnimate 원활 메인 스레드에 의해 모든 시간을 애니메이션 얻을 것이다.

+0

이 복사 프로세스가 진행되는 동안 주 스레드가 수행 할 작업은 없습니다. 사용자는 응용 프로그램을 사용하여 다른 작업을 수행 할 수 없으며 그렇게해서는 안됩니다. 양식은 모달로 표시됩니다. 왜 문서가 "Timers가 거짓 일 때 애니메이션이 별도의 스레드에서 재생되는지"라고 말할 때 어리석은 TAnimate를 사용하기 위해 스레딩의 모든 번거 로움을 해결해야합니다. 이것은 주 스레드가 루프에서 사용 중이더라도 애니메이션이 여전히 발생해야 함을 의미합니다. 그렇지 않다. – SiBrit

+0

물론 메인 스레드에 뭔가 다른 것이 있으며 호스트 운영 체제와 UI에 대한 응용 프로그램의 응답을 유지하는 것입니다. 어쩌면 당신이 그것을 좋아하지 않아,하지만 Windows 프로그래밍을 수행하는 방법입니다. – jachguate

+0

여기에 덧글을 게시하면 주 스레드가 그래픽을 새로 고치고 OS 메시지를 처리하는 동안 주 스레드가 복사 프로세스를 수행하는 새 스레드를 시작 했어야합니다. 불행히도 나는 시간이 걸렸고 메인 스레드가 복사 프로세스를 수행하고 진행에 대한 시각적 단서를 원했던 간단한 솔루션이 필요했습니다. – SiBrit

관련 문제