Newsgroups : Borland : borland.public.delphi.internet.winsock : 2006 May : Re: Can I call a procedure from OnExecute?
| Subject: | Re: Can I call a procedure from OnExecute? |
| Posted by: | "Martin James" (mjames_falc..@dial.pipex.com) |
| Date: | Wed, 10 May 2006 17:14:53 |
> Can I call a procedure directly from OnExecute
Sure. 'ReadLn' is a procedure call, OK, it's a method, but it's a still a
call).
and will that procedure be
> incorporated into
> the thread that the client connection is in
Call/return does not, in itself, change thread context. A
procedure/function/method *called* from the OnExecute event will be executed
in the context of the caller, ie. the peer thread that called OnExecute.
That procedure can call another, and that call another - it does not
matter - the thread context will not change.
or must it be in a Synchronize()
Not necessarily. 'Synchronize' is not a straightforward call/return
mechanism. It incorporates sginalling that changes thread context.
> or does it
> depend on what is in that procedure (for example using VCL) .
It does depend what is in the procedure. As you obviously know, the VCL is
not thread-safe.
> Please consider the following:
>
> ----------------------------------------------
> type
> TForm1 = class(TForm)
> IdTCPServer1: TIdTCPServer;
> procedure IdTCPServer1Execute(AThread: TIdPeerThread);
> private
> public
> end;
>
> procedure DoBlahBlah;
>
> var
> Form1: TForm1;
>
> implementation
>
> procedure DoBlahBlah;
> begin
> // DO Something Here
> end;
>
> procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
> var
> S : String;
> begin
> S := AThread.Connection.ReadLn;
> If S = 'Blah-Blah' then
> DoBlahBlah;
> end;
> --------------------------------------------
>
> Is this allowed?
Sure. In fact you can, with some care, call methods of forms, providing the
methods do not actually access VCL objects directly:
--------------------------------------------
procedure TForm1.DoBlahBlah;
begin
// DO Something Here that is thread-safe, eg:
end;
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
S : String;
begin
S := AThread.Connection.ReadLn;
If S = 'Blah-Blah' then
DoBlahBlah;
end;
--------------------------------------------
Rgds,
Martin