Q&A

  • Memory mapped 방식의 어플리케이션간 통신
안녕하십니까.
이전에 어플리케이션간 ( Pc내 ) 통신 질문을 하였습니다.
현재 write 부분과 read 부분을 Test를 하였습니다.

그리고 , component로 만들었는데요. component를 만들면서
event 방식으로 read를 할려고 합니다.

여러분도 알다시피 component는  form 이 없어서 form unit를 생성하고
여기에 timer를 만들어서 read 하는 procedure를 넣어서 실시간 check 한후
event 함수에 data를 넣습니다.  

프로그램에서 component 제작후 event 를 보내는 부분은 아래와 같습니다.
///////////////////////////////
type
// Event Procedure
  TMemMapReadMsg   = procedure (Sender : Tobject; GetLpName : String; GetData : String) of object;    //
  TMemMapStateEvent  = procedure (Sender : Tobject; GetLpName: String; GetErrorCode: String) of object;

  TGgmIPCMemMap = class(TComponent)
  private
    { Private declarations }
    FOnGgmMemMapMsg : TMemMapReadMsg;
    FOnMemMapRdEvent : TMemMapStateEvent;
    procedure DoMemMapMsg(GetLpName : String; GetData : String);             //바뀐 Data시 event 호출
    procedure DoMemMapMsgEvent(GetLpName : String; GetErrorcode : String);   //Error event 호출


//    procedure fLpNameWriteList;   // Write시 lpname list file -> FormCreat시 꼭 사용.
  protected
    { Protected declarations }
   ....................
  public
    { Public declarations }
    procedure Open;
    procedure mStart;             // Write시 lpname 함수. ( lpname 당 handle 생성 )
    procedure fLpNameReadList;    // read시 lpname list file // 외부에서 못 읽어야 함.
    procedure fLpNameWriteList;   // Write시 lpname list file -> FormCreat시 꼭 사용.
    procedure mWrite(GetLpName : String; GetWriteWord : String);
//    Procedure mRead;
    procedure RealData(GetLpname : String; GetData : String);
//    procedure DoMemMapMsg(GetLpName : String; GetData : String);             //바뀐 Data시 event 호출
//    procedure DoMemMapMsgEvent(GetLpName : String; GetErrorcode : String);   //Error event 호출

    constructor Create(AOwner: Tcomponent) ; override;
    destructor Destroy; override;

  published
    { Published declarations }
    property OnMemMapRdMsg : TMemMapReadMsg  read FOnGgmMemMapMsg                          write FOnGgmMemMapMsg;
    property OnMemMapRdEvent : TMemMapStateEvent read FOnMemMapRdEvent              write FOnMemMapRdEvent;

  end;
.........................................
procedure TGgmIPCMemMap.DoMemMapMsg(GetLpName : String; GetData : String);
begin
  if Assigned(FOnGgmMemMapMsg) then // FOnGgmMemMapMsg
    begin
        FOnGgmMemMapMsg( Self,GetLpName, GetData);
    end;

end;

procedure TGgmIPCMemMap.DoMemMapMsgEvent(GetLpName : String; GetErrorcode : String);   //Error event 호출
begin
  if Assigned(FOnMemMapRdEvent) then
    begin
        FOnMemMapRdEvent(Self, GetLpName, GetErrorcode);
    end
end;

위와 같이 read 한 data가 있을 경우 DoMemMapMsg , DoMemMapMsgEvent procedure
를 호출하면  event가 발생합니다. 예전에 같은 방식으로 event 부분을 처리 하였는데 이번엔
이상하게 안됩니다. read 함수는 uses 한 form unit에서 timer에 넣었습니다.

그래서 혹시 프로그램 문제인가 해서 test 프로그램내에 component를 넣고 read를 test 프로그램
내 timer로 돌리면 event 가 제대로 됩니다. 그런데 component uses form의 timer에 read를
넣고 하면 event가 발생 안합니다.

부연 설명을 하자면,DoMemMapMsg , DoMemMapMsgEvent 함수에서 parameter GetLpname
과 GetErrorCode , GetData 에 Data 도 잘 들어 갑니다. 문제는 FOnGgmMemMapMsg, FOnMemMapRdEvent가 계속적으로 Nil 값이 들어갑니다. 그래서 안되는 거 같은데 해결 제가 좀 지식이 짧아서 잘 모르겠네요.

결과적으로 정리하면 FOnGgmMemMapMsg, FOnMemMapRdEvent 부분이 Nil로 지속되는 것인데
test 프로그램내에서 timer로 read를 하면 잘되고 component 에서 uses한 form unit내 timer로 하면
안됩니다. 해결 방법 부탁드립니다.

긴 내용을 읽어 주어서 감사합니다. ㅠㅠ
즐프~~ㅠㅠ
0  COMMENTS