답변 감사합니다.
하나만 더 여쭤볼게요 ^-^
typedef void __fastcall (__closure *TNotifyEventEx)(System::TObject* Sender , int a );
이렇게 TNotifyEventEx를 선언하잖아요
파라이터에 다른 타입들은 괜찮은데 벡터를 넘기면 에러가 나네요.
에러메시지 입니다.
[C++ Error] Thread.h(26): E2301 Cannot use templates in closure arguments -- use a typedef
답변 부탁드려요.
장성호 님이 쓰신 글 :
: 참조
:
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);
: :
: : 이런식으로 쓰레드를 생성했는데
: :
: : 자꾸 에러 나는데 어떻게 고쳐야할 지 모르겟네요.
: :
: : 답변 부탁드립니다.