|
동기화 시켜 주면 됩니다.
Project 에서 새로 만들기 해서 Thread Object 를 선택해서 만들어 보시면
cpp 파일에 아래와 같은 주석으로 간단 한 예가 있습니다.
------< C++ Builder 에서 Thread 추가시 cpp 파일 예제 >---------------
// 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 JsTread::UpdateCaption()
// {
// Form1->Caption = "Updated in a thread";
// }
' Important' --> 중요하다고 쓰여있죠?
저도 쓰레드에 대해서는 잘 모르는데
화면에 Display 되는 부분은 Process에 main 쓰레드와 동기화가 절대 필수적입니다.
아래는 최근에 제가 쓰레드를 이용해서 프로젝트를 한 예제 일부분 입니다.
-------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "JThread.h"
#include "frmMain.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
__fastcall TJsThread::TJsThread(bool CreateSuspended,int type)
: TThread(CreateSuspended)
{
//우선순위 : tpLowest, tpLower, tpNormal, tpHigher, tpHighest, tpTimeCritical
Priority=tpHigher;//tpLowest;//tpLower;//tpNormal;//tpTimeCritical;
Type=type; //true=Auto , false=Manual->Auto
}
void __fastcall TJsThread::Execute()
{
Synchronize(Main->DisplayLog);
Synchronize(Main->SetTimeOut);
Synchronize(Main->Memo);
Synchronize(Main->Statistic);
if(Type==1)
{
Main->AutoSearch();
}
}
//--------------------------------------------------------------
쓰레드의 Execute() 함수안에서 Main폼에 있는 화면에 Display 해주는
Main폼 Class 안에 함수들을 동기하 시켜주고있습니다.
뭐 생성자에서 해도 될것 같구요
하늘마루 님이 쓰신 글 :
: 안녕하세요.
: cmsMSDS라는 DLL이 있습니다. 이 DLL에서는 메인 폼에 있는 ListView의 핸들을 얻어와서
: 서브클래싱하여 특정 필드에 체크버튼을 만드는 것을 만들었습니다.
: 그런데, 체크버튼을 안만들고 InsertItem 등을 하면 잘 나옵니다만, 체크버튼을 만들게 시키면, 먹통이 되어
: 버리네요. 체크버튼이 안보이는 것은 당연지사입니다.
:
: 참... cmsMSDS.DLL은 Worker Thread로 동작하도록 만들고, 소켓으로 들어오는 데이터를 계속 감시하면서
: 그 데이터를 처리하는 역할을 합니다.
: 당연히 Thread 루프 내에서 데이터에 따라서 체크버튼을 만들지 안만들지를 결정합니다.
: 체크버튼을 만들기로 결정하면 제가 ListView를 서브클래싱한 놈에게 체크 박스를 만들도록 하지요.
:
: Thread 루프 안에서 체크버튼을 만들도록 시키지 않고, 다른 곳에서 만들도록 하면, 화면에 아주 이쁘게
: 잘 그려집니다.
:
: 도대체 이유가 뭘까요?
|