|
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 버전입니다.
|