Al Boldi wrote:
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;
========================
Thanks. Another solution is to use the dnotify api of the kernel.
Someone already tried dnotify with fpc?
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.
Good to know. I don't have experience with pipes.
Luiz
_________________________________________________________________
To unsubscribe: mail [EMAIL PROTECTED] with
"unsubscribe" as the Subject
archives at http://www.lazarus.freepascal.org/mailarchives