C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[53692] Re:Re:팁&트릭의 지정함수를 쓰레드에 실어서 실행시키는 방법에 대해 질문이요~
조세현 [corea139] 1415 읽음    2008-06-17 11:20
답변 감사합니다.

하나만 더 여쭤볼게요 ^-^

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);
: :
: : 이런식으로 쓰레드를 생성했는데
: :
: : 자꾸 에러 나는데 어떻게 고쳐야할 지 모르겟네요.
: :
: : 답변 부탁드립니다.

+ -

관련 글 리스트
53688 팁&트릭의 지정함수를 쓰레드에 실어서 실행시키는 방법에 대해 질문이요~ 조세현 1110 2008/06/16
53689     Re:팁&트릭의 지정함수를 쓰레드에 실어서 실행시키는 방법에 대해 질문이요~ 장성호 1544 2008/06/17
53692         Re:Re:팁&트릭의 지정함수를 쓰레드에 실어서 실행시키는 방법에 대해 질문이요~ 조세현 1415 2008/06/17
53696             Re:Re:Re:팁&트릭의 지정함수를 쓰레드에 실어서 실행시키는 방법에 대해 질문이요~[자답] 조세현 1407 2008/06/17
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.