networking - Server process running on Indy10 partially stops responding when OnConnect event interacts with a TTabControls Tabs from another form in Lazarus -


tried describe of problem in title, , did.

basically, i've made own little tcp server indy 10 in lazarus. accepts packets in form of bytes contain char representing letter english alphabet. i'm reading these bytes contexts' iohandler this:

procedure tserversideform.onexecuteserver(context: tidcontext); var   io: tidiohandler;   keypressed: char; begin   //   io := context.connection.iohandler;    if not(io.inputbufferisempty)   begin     logform.logtoform('recieving packet ' + context.binding.ip + '(' + context.binding.peerip + ')');      keypressed := io.readchar;     addkeytoappropriateclient(keypressed, context.binding.ip);   end;    indysleep(10);   // end;  

and works perfectly.

however, i've got form has ttabcontrol in it, has tab each user connected server, there tmemo in each tab. tabs , memos created @ runtime , function that, not throw exceptions.

here's how addtab() function other form looks (for creating tabs , memos described above):

procedure tconnectionsform.addtab(ip: string); var   newmemo: tmemo; begin   connectiontabs.tabs.add(ip);   currtabindx := connectiontabs.tabindex;    newmemo := tmemo.create(connectionsform);    newmemo.anchorside[aktop].side:=asrtop;   newmemo.anchorside[aktop].control:=connectiontabs;   newmemo.borderspacing.top:=2;    newmemo.anchorside[akbottom].side:=asrbottom;   newmemo.anchorside[akbottom].control:=connectiontabs;   newmemo.borderspacing.bottom:=2;    newmemo.anchorside[akleft].side:=asrleft;   newmemo.anchorside[akleft].control:=connectiontabs;   newmemo.borderspacing.left:=2;    newmemo.anchorside[akright].side:=asrright;   newmemo.anchorside[akright].control:=connectiontabs;   newmemo.borderspacing.right:=2;    newmemo.anchors := [aktop, akbottom, akleft, akright];    newmemo.parent := connectiontabs;   newmemo.visible:=true;    newmemo.lines.add(ip);    setlength(connectionmessagesarr, length(connectionmessagesarr)+1);   connectionmessagesarr[length(connectionmessagesarr)-1] := newmemo;    showonly(currtabindx); end;  

it seems working fine, i've tested multiple times on own.

but when run function onconnect function tidtcpserver server process seems freeze until other event, onexecute, example, happens. when onexecute execute, messages have been accepted process executed. example, if program freezes, , while it's frozen, try minimize 1 of forms , move other form somewhere else on screen, after program unfreezes.

here's own onconnect function:

procedure tserversideform.onconnectserver(context: tidcontext); begin   logform.logtoform(context.binding.ip + ' has connected server (' + context.binding.peerip + ')');    //connectionsform.addtab(context.binding.peerip); // boom   //connectionsform.connectiontabs.tabs.add('!!'); // boom end;   

as i've stated in title, kind of interaction ttabcontrols tabs makes program freeze. connectionsform.connectiontabs.tabs.add('!!'); makes program freeze (here, connectionstabs ttabcontrol variable inside form called connectionsform).

i have no idea going on in here, appreciated.

well, yes, program thread-unsafe.

solved problem adding little sync class:

type   tmysync = class(tidsync)   protected     procedure dosynchronize; override;   public     context: tidcontext;   end; 

and doing ttabcontrol shenanigans in dosyncronize overridden function.

procedure tmysync.dosynchronize; begin   logform.logtoform(context.binding.ip + ' has connected server (' + context.binding.peerip + ')');    connectionsform.addtab(context.binding.peerip); end;  

and onconnect has been changed to:

procedure tserversideform.onconnectserver(context: tidcontext); var   sync: tmysync; begin //   sync := tmysync.create;   try     sync.context := context;     sync.synchronize;       sync.free;   end; end;      

p.s. did analogous ondisconnect function.

everything seems work now.


Comments

Popular posts from this blog

ubuntu - PHP script to find files of certain extensions in a directory, returns populated array when run in browser, but empty array when run from terminal -

php - How can i create a user dashboard -

javascript - How to detect toggling of the fullscreen-toolbar in jQuery Mobile? -