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
[29091] Re:자답......
초보 [] 1336 읽음    2004-03-18 20:29
TIdThread의 델파이 소스를 보니 TThread::Synchronize(TThreadMethod&)를 그대로 호출하는 관계로

저대로는 해결이 불가능하여

ParamList를 클래스 멤버로 넣고 파라미터 없는 함수를 새로 만들었더니 해결이 되었습니다...-_-

다음은 수정된 부분입니다...

class TIdThreadTest {
    TStringList* GlobalParam;    //Global StringList Parameter
    TCriticalSection* CS;        //Global StringList 임계구역 설정용

    TIdTCPClient *Socket;

    void __fastcall DoSync(TIdPeerThread* AThread);
    void __fastcall DoSyncFunc();       
public :
    __fastcall TIdThreadTest();
    TNotifyEvent OnSyncFunc;
};


void __fastcall TIdThreadTest::DoSync(TIdPeerThread* AThread)
{
   if(OnSyncFunc) {
      CS->Acquire();
      //Global ParamList 할당
      ...
     
      AThread->Synchronize(DoSyncFunc);     //
      CS->Release();
   }
   delete ParamList;
}

void __fastcall TIdThreadTest::DoSyncFunc()
{
  OnSyncFunc(GlobalParam);
}


초보 님이 쓰신 글 :
: 파라미터를 갖는 Method를 동기화하는 방법에 대해 고심하던 중
:
: TIdThread내 재정의된 Synchronize(TMethod& Method) 메소드를 사용하여
:
: 파라미터를 갖는 일반 메소드(TNotifyEvent Type을 사용하여 StringList를 넘기는 방법을 구상중) 를
:
: 동기화하기 위하여 아래와 같은 코드를 작성하여 테스트 도중 문제가 발생합니다.
:
: class TIdThreadTest {
:     TIdTCPClient *Socket;
:
:     void __fastcall DoSync(TIdPeerThread* AThread);
:        
: public :
:     __fastcall TIdThreadTest();
:     TNotifyEvent OnSyncFunc;
: };
:
:
: void __fastcall TIdThreadTest::DoSync(TIdPeerThread* AThread)
:    TMethod AMethod;
:    TStringList *ParamList = new TStringList;
:
:    //ParamList 할당
:    ...
:
:    if(OnSyncFunc) {
:       AMethod->Code = &OnSyncFunc;
:       AMethod->Data = ParamList;
:      
:       AThread->Synchronize(AMethod);     //이 부분에서 Access Violation 에러가 발생합니다...
:    }
:    delete ParamList;
: }
:
: ....
: class TestForm : TForm {
:    TIdThreadTest* AIdThreadTest;
:
: };
:
: __fastcall TestForm::TestForm(TComponent *Owner)
:    : TForm(Owner)
: {
:    AIdThreadTest = new TIdThreadTest();
:    AIdThreadTest->OnSyncFunc = SyncFunc;   
: }
:
: void __fastcall TestForm::SyncFunc(TObject *ParamList)
: {
:     //Main Thread내 VCL Handling 작업
:     ...
: }
:
: 이러한 경우 어떻게 해결해야 할지 고수님들의 한 수 가르침 부탁드립니다....
:
: 참고로 Indy버전은 9.00.14 버전입니다.

+ -

관련 글 리스트
29090 [질문] Indy Thread에서 동기화에 관련된 질문입니다. 초보 1306 2004/03/18
29091     Re:자답...... 초보 1336 2004/03/18
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.