Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / lazarus / 2014-07

Synapse CanRead, true on thread terminate

1 message · 1 person ·

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

kapibara

Hi, I'm using Synapse to make a TCP server. Does someone know why the function CanRead return true when the server thread terminates? In the synapse echo demo, this causes a new ClientThread to be created on closing the app or any time the thread is terminated. I cant figure out why this should happen?

To avoid that I changed:|

if CanRead(1000) then|

to :|

if CanRead(1000) and (not Terminated) then|

Execute of server thread (from synapse echo demo):

procedure TTCPEchoDaemon.Execute;
var
   ClientSock: TSocket;
begin
   with Sock do
     begin
       CreateSocket;
       SetLinger(true,10000);
       Bind('127.0.0.1','7070');
       Listen;
       repeat
         if Terminated then Break;
         if CanRead(1000) then
           begin
             ShowMessage('The thread is dead, long live the thread.');
//Exception on thread terminate
             ClientSock:= Accept;
             if LastError = 0 then
             begin
               TTCPEchoThrd.Create(ClientSock);
             end;
           end;
       until False;
     end;
end;

It causes the program to go on and create a new ClientThread even when Terminated is true. After understanding that this happened, I worked around it by changing:

Code: [Select] <javascript:void(0);>

| if CanRead(1000) then|

to this:

Code: [Select] <javascript:void(0);>

| if CanRead(1000) and (not Terminated) then|

But is that good? Shouldnt something like that be in one of the demos if so? Or I have not understood how it should be done?

|procedure TMyServer.Execute;
var
   ClientSock: TSocket;
   aClientThread: TClientThread;
begin
   with Sock do
   begin
     CreateSocket;  // auto-created by Synapse if not done manually}
     SetLinger(True, 10000);
     Bind('0.0.0.0','7070');
     Listen;
     if LastError = 0 then Log('Server is Online');
     repeat
       if Terminated then
       begin
         if Assigned(aClientThread) then aClientThread.Terminate;
         Break;
       end;
       if CanRead(1000) and (not Terminated) then  //Neglect CanRead if serverthread is terminated!
       begin
         Log('Server: Someone connected');
         ClientSock := Accept;
         if LastError = 0 then
         begin
           aClientThread:= TClientThread.Create(ClientSock);
           aClientThread.OnLog:= Self.OnLog; //Enable logging to main form
           aClientThread.Start;
         end;
       end;
     until False;
   end;
end;|

Also, from comments in Synapse sources:

"CanRead: This function is need only on special cases, when you need use @link(RecvBuffer) function directly! read functioms what have timeout as calling parameter, calling this function internally."

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.lazarus.freepascal.org/pipermail/lazarus/attachments/20140713/02e102ee/attachment.html>

Reply by email