|
VCL 쓰레드가 하는 일 중 하나는 화면에 시각적으로 표시되는 컴포넌트를 처리하는 것입니다.
물론 쓰레드이기 때문에 다른 Thread와 동기화 문제가 발생할 가능성이 있습니다.
고로.. 님이 만드신 Thread에서 User Interface와 관련된 처리를 하게 될 때면
VCL 쓰레드와 충돌이 발생할 가능성이 높습니다.
이런 경우 Thread에서 User Interface와 관련된 처리를 하는 함수를
procedure UIFunc; 라는 함수로 만들어 놓고
Thread 안에서 필요할 때 Synchronize(UIFunc); 라는 형식으로 호출합니다.
Thread Class를 하나 만들어 보면 다음과 같은 주석으로 설명해 줍니다.
//---------------------------------------------------------------------------
// Important: Methods and properties of objects in VCL can only be
// used in a method called using Synchronize, for example:
//
// Synchronize(UpdateCaption);
//
// where UpdateCaption could look like:
//
// void __fastcall TTest::UpdateCaption()
// {
// Form1->Caption = "Updated in a thread";
// }
//---------------------------------------------------------------------------
고로 님이 겪고 계신 문제는 Thread 내에서 Canvas 가지고 작업하는 루틴을
별도의 함수로 Refactoring 해서 Synchronize(func)로 호출하시면 되겠습니다.
이재율 님이 쓰신 글 :
: 쓰레드를 사용중에 이런 에러가... 나오는데요..
:
: ---------------------------
: Debugger Exception Notification
: ---------------------------
: Project DownLoader.exe raised exception class EInvalidOperation with message 'Canvas does not allow drawing'. Process stopped. Use Step or Run to continue.
: ---------------------------
: OK Help
: ---------------------------
:
:
: 이게.... 어쩔땐 나오고.... 어쩔땐 또 안나오고......
:
: 지맘대로 입니다... ㅜㅜ
:
: 어찌혀야 되나요?~
:
: 대체 저게 무슨 말인가요?
|