|
Synchronize도 내부적으로 살펴 보면 전부
Main Thread에게 message를 보내는 SendMessage API를 사용하고 있습니다.
COM의 EventHandler에서 VCL Main Thread를 제어하고 싶으면
message를 사용하시면 됩니다.
---------------------------------------------------------------------------
h file
---------------------------------------------------------------------------
#define WM_MYEVENT WM_USER + 10
...
class TForm1 : public TForm
{
void __fastcall ComEvent(TObject *Sender); // Com(Type Library에서 제공하는 Event)
void WmMyEvent(TMessage & Msg); // 내가 정의한 Event
...
BEGIN_MESSAGE_MAP // message map을 만들고
VCL_MESSAGE_HANDLER(WM_COMEVENT, TMessage, WmMyEvent)
END_MESSAGE_MAP(TForm)
};
---------------------------------------------------------------------------
cpp file
---------------------------------------------------------------------------
void __fastcall TForm1::ComEvent(TObject *Sender) // Com에서 요 이벤트가 발생하면
{
SendMessage(this->Handle, WM_MYEVENT, 0, 0); // message를 보내 WmMyEvent가 실행되게 한다.
}
void TForm1::WmConEvent(TMessage & Msg) // 이 코드를 수행할 때는 main thread로 전환된다. 디버깅 때 Ctrl+Atl+T를 눌러 확인해 보시라.
{
ShowMessage("쓰벌, main thread 기능들을 마음대로 쓰자!!!");
...
}
그리고 인자 전달은 전역변수(TForm1에 선언해 놓거나 Globa로 선언해 놓거나)와 CriticalSection 변수를 동시에 사용하는 방법이 있고
SendMessage에 wParam, lParam을 사용하는 방법이 있습니다.
만약 인자가 많아 질 경우에는 WM_COPYDATA를 사용하는 방법도 있습니다.
WM_COPYDATA는 다른 Process간에도 메모리공유와 비슷한 기능을 하기 때문에 유용하게 사용되어 지고 있습니다.
김영균 님이 쓰신 글 :
: C++빌더 5.0으로 프로그램을 만들고 있습니다.
Thread Library 를 직접 만들어서 사용하고 있는데.
VCL main thread 와의 동기문제가 발생했습니다.
Synchronize 와 비슷한 메쏘드를 구현하는 방법은 없나요?
또, Critical Section 이나 세마포어로 직접 VCL main thread 와
동기시키는 방법은 없나요?
Synchronize 메쏘드는 인자 전달이 힘들어서요.
그럼,
|