|
Synchronize 가 되지 않아서 그런게 아닌가 싶습니다. Thread에서 VCL 객체로 접근하려면, Synchronize를 항상 시켜 주셔야 합니다. 이 것은, 쓰레드를 처음 만들면 나오는 소스 파일에 주석에도 붙어 있습니다.
MyPrg(no);
호출을
Synchronize(MyPrg(no));
로 해주신 다음 결과를 보시는 것도 좋으실것 같습니다.
아래는 Synchronize의 Help 파일입니다.
void __fastcall TMyThread::PushTheButton(void)
{
Button1->Click();
}
void __fastcall TMyThread::Execute()
{
...
Synchronize(PushTheButton);
...
}
하안인 님이 쓰신 글 :
: CRITICAL_SECTION CS;
: 폼에
: void __fastcall TForm1::Update(int no,String Msg)
: {
: EnterCriticalSection(&CS);
: ListBox1->Items->Add(IntToStr(no)+Msg);
: LeaveCriticalSection(&CS);
: }
:
: int __fastcall TyThread::Execute()
: {
: while(true)
: {
: MyPrg(no);
: }
: }
: int __fastcall TyThread::MyPrg(int no)
: {
: ....
: Form1->Update(no,msg);
: .....
: Form1->Update(no,msg);
:
: }
:
: 폼에 페이지컨트롤을 하나 놓고 페이지를 여러개 놓은 중에 하나의 페이지에 ListBox
: 가 있습니다.
: 이 ListBox의 Item에 여러개의 쓰레드가 내용을 추가하려고 합니다.
: 그런데 쓰레드 하나만 띄워놓고도 데이타를 추가하면 원도우 핸들을 읽어버리는것 같습니다.
: Append되는 페이지의 컨트롤을 누르면 그때부터 그 페이지컨트록은 먹통이 됩니다.
: 페이지 컨트롤의 한 페이지(업데이트되는)를 클릭하면 내용이 없고 자기 맘대로
: 페이지 컨트롤이 움직입니다.(쓰레드에서 업데이트 할때)
: 위와 같이 쓰레드를 구현하는것이 틀린건가요.
:
:
: 참고로 쓰레드에서 폼의 컨트롤에 업데이트 하는 부분을 삭제후 테스트 하면
: 정상적으로 작동합니다.
: 그리고 페이지 컨트롤이 아닌 폼에 ListBox를 직접적으로 올려 놓으면
: 정상작동을 하는데..
: 페이지 컨트롤에서 업데이트되는 페이지가 선택안되어 있어도 상관없이
: 업데이트되어야 하는것 아닌가요.
:
: 그럼, 조언 부탁드립니다.
:
|