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
[53696] Re:Re:Re:팁&트릭의 지정함수를 쓰레드에 실어서 실행시키는 방법에 대해 질문이요~[자답]
조세현 [corea139] 1407 읽음    2008-06-17 14:30
에러 메시지를 잘 해석해보니까

파라미터엔 템블릿을 쓸 쓰 없으며 typedef를 사용하라고 되어있네요.

그래서 해봤더니 됩니다 ^^;;


조세현 님이 쓰신 글 :
: 답변 감사합니다.
:
: 하나만 더 여쭤볼게요 ^-^
:
: 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:팁&트릭의 지정함수를 쓰레드에 실어서 실행시키는 방법에 대해 질문이요~ 조세현 1416 2008/06/17
53696             Re:Re:Re:팁&트릭의 지정함수를 쓰레드에 실어서 실행시키는 방법에 대해 질문이요~[자답] 조세현 1407 2008/06/17
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.