참조
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=677
위 팁 제목이 "지정함수를 쓰레드에 실어서 실행..." 입니다.
즉 쓰레드 내에서 함수를 실행하는 합니다.
그러려면 쓰레드에 함수포인터를 넘겨줘야겠죠?
그리고 함수호출에 필요한 파라메터도 넘겨줘야할것이구
보신 강좌에 쓰레드 class가 아래와 같이 선언되어있습니다.
class TRunThread : public TThread
{
private:
TNotifyEvent OnEvent;
TObject* Sender;
public:
__fastcall TRunThread(TNotifyEvent event, TObject* sender)
: TThread(false)
{
FreeOnTerminate = true;
OnEvent = event;
Sender = sender;
}
void __fastcall Execute()
{
OnEvent(Sender);
}
};
그리고 다음과 같이 호출하죠?
void __fastcall TForm1::Button3Click(TObject *Sender)
{
Button3->Enabled = false;
TRunThread* thread = new TRunThread(&TestFunc, Sender);
thread;
}
위 에서 쓰레드 생성하면서 parameter로 넘긴것을 잘 보십시요
TestFunc의 주소와 TObject*를 넘깁니다.
여기서 &TestFunc가 함수의 TNotifyEvent 형의 함수 포인터라고 볼수 있습니다.
그럼 실제 TestFunc 함수가 호출되는곳은 어디일까요?
__fastcall TRunThread(TNotifyEvent event, TObject* sender)
: TThread(false)
{
FreeOnTerminate = true;
OnEvent = event; //쓰레드가 생성되면서 파라메터로 받은 함수포인터와 인자를 저장
Sender = sender;
}
void __fastcall Execute()
{
OnEvent(Sender); //파라메터로 받은 함수를 호출함
}
쓰레드의 Execute에서 OnEvent(Sender)에서 호출되는것입니다.
자 이제 님께서 원하는 형태의 함수를 호출하려면 어떻게 해야 할까요?
1. 쓰레드를 생성인자를 TNotifyEvent 형이 아닌 인자가 두개 인 형으로 받아야 겠죠
그리고 함수 호출때 넘겨줄 인자도 2개 받아야 하구
참조 TNotifyEvent 형은 Classes.hpp에 아래와 같이 선언되어있습니다.
typedef void __fastcall (__closure *TNotifyEvent)(System::TObject* Sender);
위 TNotifyEvent 선언을 참조하여 파라메타가 2개인 함수타입을 선언합니다.
typedef void __fastcall (__closure *TNotifyEventEx)(System::TObject* Sender , int a );
TNotifyEventEx 라고 선언했습니다.
2. 쓰래드 생성자도 수정해줘야죠?
기존에는 __fastcall TRunThread(TNotifyEvent event, TObject* sender) 와 같았는데
TNotifyEvent 는 TNotifyEventEx로 바꾸고 Sender 와 int 파라메터도 받아야겠죠
__fastcall TRunThread(TNotifyEventEx event, TObject* sender , int val )
: TThread(false)
{
FreeOnTerminate = true;
OnEvent = event; //TNotifyEventEx 형 함수포이터를 받아서 저장
Sender = sender; // 함후 호출에 쓸 parameter sender와 val도 저장
a=val;
}
3. 이제 실제로 Execute에서 호출하면 됩니다.
void __fastcall Execute()
{
OnEvent(Sender,a);
}
void __fastcall TForm1::Button3Click(TObject *Sender)
{
Button3->Enabled = false;
TRunThread* thread = new TRunThread(&TestFunc, Sender , 10 );
thread;
}
님의 코드와 다른게 보이죠?
그럼..
조세현 님이 쓰신 글 :
: TestFunc라는 함수를 쓰레드에 포함시킬 때
:
: TestFunc의 파라미터는 TObject *Sender 인데
:
: 그 외의 파라미터를 추가시킬 수는 없나요?
:
: TestFunc(TObject *Sender, int a) 이런 식으로요...
:
: TRunThread * thread = new TRunThread(&TestFunc(10), Sender);
:
: 이런식으로 쓰레드를 생성했는데
:
: 자꾸 에러 나는데 어떻게 고쳐야할 지 모르겟네요.
:
: 답변 부탁드립니다.