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
[53689] Re:팁&트릭의 지정함수를 쓰레드에 실어서 실행시키는 방법에 대해 질문이요~
장성호 [nasilso] 1544 읽음    2008-06-17 03:02
참조
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 팁&트릭의 지정함수를 쓰레드에 실어서 실행시키는 방법에 대해 질문이요~ 조세현 1111 2008/06/16
53689     Re:팁&트릭의 지정함수를 쓰레드에 실어서 실행시키는 방법에 대해 질문이요~ 장성호 1544 2008/06/17
53692         Re:Re:팁&트릭의 지정함수를 쓰레드에 실어서 실행시키는 방법에 대해 질문이요~ 조세현 1416 2008/06/17
53696             Re:Re:Re:팁&트릭의 지정함수를 쓰레드에 실어서 실행시키는 방법에 대해 질문이요~[자답] 조세현 1408 2008/06/17
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.