Luiz Americo Pereira Camara wrote:
> Kris Leech wrote:
> > Good stuff, did you come across any issues with simpleIPC, Ive been
> > meaning to have a go with it for a while...
>
> I had two issues with simpleipc:
>  - in unix the TSimpleIPCServer.OnMessage event is not fired. To
> override this, a solution is to call ReadMessage in the OnIdle event of
> the application.

Try this implementation:
========================
type

  { TPeekThread }
  TPeekThread = Class(TThread)
  private
    FDoPeek: TNotifyEvent;
  protected
    procedure Execute; override;
    procedure Synchronize(Method: TThreadMethod);
    Property DoPeek: TNotifyEvent read FDoPeek write FDoPeek;
  end;

  { TSimpleIPCpServer }
  TSimpleIPCpServer = Class(TSimpleIPCServer)
  private
    FPeek: Boolean;
    FPeekThread: TPeekThread;
    procedure PeekMethod(Sender: TObject);
    procedure SetPeek(const AValue: Boolean);
  protected
    Procedure Activate; override;
    Procedure Deactivate; override;
  published
    Property Peek : Boolean read FPeek write SetPeek;
  end;

implementation

{ TPeekThread }
procedure TPeekThread.Execute;
begin
  repeat
    FDoPeek(self);
  until Terminated;
end;

procedure TPeekThread.Synchronize(Method: TThreadMethod);
begin
  inherited;
end;

{ TSimpleIPCpServer }
procedure TSimpleIPCpServer.PeekMethod(Sender: TObject);
begin
  if PeekMessage(1000,false) then
    TPeekThread(sender).Synchronize(@ReadMessage);
end;

procedure TSimpleIPCpServer.SetPeek(const AValue: Boolean);
begin
  if FPeek=AValue then exit;
  if FActive then DoError(SErrActive,[]);
  FPeek:=AValue;
end;

procedure TSimpleIPCpServer.Activate;
begin
  inherited Activate;
  if FActive and FPeek then begin
    FPeekThread:=TPeekThread.Create(true);
    FPeekThread.DoPeek:[EMAIL PROTECTED];
    FPeekThread.FreeOnTerminate:=true;
    FPeekThread.Resume;
  end;
end;

procedure TSimpleIPCpServer.Deactivate;
begin
  if FActive and FPeek then begin
    FPeekThread.Terminate;
  end;
  inherited Deactivate;
end;
========================

BTW:  Somebody know how to override a Classname, like it's possible with 
Methods.  i.e:  TComponent = Class(TComponent); override;

>  - The other is that there's currently no easy way to diferentiate
> between different message types. Let's say i need to send messages
> telling i started the job, send the results of the job and than finished
> the job. Currently there are two options: send a header in the stream
> with a numeric variable and check it when arrive (you lose the comodity
> of SendStringMessage) or you send a string with a string marker. I will
> propose a change in it (and provide the patch) where we could use the
> MessageType (user defined) to identify the message and we could still
> use SendStringMessage .

Or you could use another SimpleIPC connection.

> - another potential problem (not tested) is that in unix a file is used
> to pass the messages. So if the program crashes the file may not be
> deleted and would give that the server is running.

In unix it uses pipes.  No problem when program crashes.


Thanks!

--
Al

_________________________________________________________________
     To unsubscribe: mail [EMAIL PROTECTED] with
                "unsubscribe" as the Subject
   archives at http://www.lazarus.freepascal.org/mailarchives

Reply via email to