Q&A

  • Active-X에서 TIdTCPClient의 자료수신용 Thread에서 Synchronize문제
[질문] Active-X에서 TIdTCPClient의 자료수신용 Thread에서 Synchronize문제

사용환경 - 델파이 버전 : 7.0

Active-X에서 TIDTcpClient를 생성하여 서버와 통신을 합니다.
서버소켓에서 오는 자료를 수신하기 위하여 별도의 Thread를 생성하였는데요...
Active-X Form 내에서 서버로부터 수신되는 자료를 Thread내에서 받아서 Synchronize 메소드를 이용하여
자료를 처리를 할려구 합니다.
자료처리 방법은 아래와 같이 했구요.
1.Thread.Execute 내에서 자료를 읽어서 Private변수에 할당
2.Thread.Execute내에서 Synchronize 메소드 호출
3.해당 Synchornize 메소드내에서 Active-X의 Handle을 이용하여 PostMessage 발송
4.Active-X내에서 Thread로 부터 PostMessage로 받은 Event가 발생
5.Active-X내의 사용자 메세지 처리 부분에서 자료처리

위와 같이 했었는데....Sycnchronize가 동작하지 않는 문제가 발생하여서
Thread.execute내에서 Sychronize호출대신 바로 Active-X로 PostMessage하도록 바꾸니
Active-X가 동작을 합니다.

Active-X내의 신규로 생성된 Thread내에서는 원래 Synchronize가 정상동작하지 않는것인지요?
이에 대해 경험이 있으신 분들은 이런 문제를 어떤방식으로 우회하여 문제를 해결하셨는지 조언을
부탁드립니다.
1  COMMENTS
  • Profile
    이병협 2005.02.26 02:15
    delphi 6,7 에서 activex내에서 synchronize가 문제가 있다고 하는군요.
    ActiveX에 다음과 같이 코딩을 해 보세요.
    다른 문제때문에 고민하다가 아래 내용되로 하니까 해결이 되더군요.

    const
       WM_CLSYNCHRONIZE = WM_USER + 1;
    ...
    type
       TActiveFormX = class(TActiveForm, IActiveFormX)
          procedure WMclSynchronize(var Message: TMessage); message WM_CLSYNCHRONIZE;
    ...
    procedure TActiveFormX.ActiveFormCreate(Sender: TObject);
    begin
       Classes.WakeMainThread := DoOnWakeMainThread;
    end;

    procedure TActiveFormX.DoOnWakeMainThread(Sender: TObject);
    begin
       PostMessage(Self.Handle, WM_CLSYNCHRONIZE, 0, 0);
    end;

    procedure TActiveFormX.WMclSynchronize(var Message: TMessage);
    begin
       Classes.CheckSynchronize();
    end;

    해결 되었으면 좋겠군요.
    수고하세요.