title: Access function result inside thread
body: <p>I'm working with Threads (again) and this is always pain in the... I have one function inside my thread class, and it's private. The function, returns one boolean result, to check if some POP3 server is valid or no. The checking is working, I tested it, and looks like working at least, but I'm having a problem to access the result when tryin it inside Thread.Execute procedure.. I'll explain more, let's go to the codes... Here is the declaration:</p>
  
  <pre><code>type
    MyThread = class(TThread)
    public
      constructor Create(HostLine: string);
    protected
      procedure Execute; override;
      procedure MainControl(Sender: TObject);
    private
      Host: string;
      function CheckPOPHost: boolean; //this is the problematic function
    end;
  </code></pre>
  
  <p>So the function is something like this:</p>
  
  <pre><code>function MyThread.CheckPOPHost: boolean;
  var
    MySocket: TClientSocket;
    SockStream: TWinSocketStream;
    Buffer: array[0..1023] of Char;
    ReceivedText: string;
  begin
    Result:= false;
    FillChar(Buffer, SizeOf(Buffer), #0);
    MySocket:= TClientSocket.Create(Nil);
    MySocket.Port:= 110;
    MySocket.ClientType:= ctBlocking;
    MySocket.Host:= Host;
    MySocket.Active:= true;
    if (MySocket.Socket.Connected = true) then
      begin
        SockStream := TWinSocketStream.Create(MySocket.Socket, 1000);
        SockStream.WaitForData(10000);
        while (SockStream.Read(Buffer, SizeOf(Buffer)) &lt;&gt; 0) do
          ReceivedText:= ReceivedText + Buffer;
        if Length(ReceivedText) &gt; 0 then
          ReceivedText:= PAnsiChar(ReceivedText);
        if AnsiStartsStr('+', ReceivedText) then
          Result:= true;
      end;
    SockStream.Free;
    MySocket.Free;
  end;
  </code></pre>
  
  <p>So, you don't need to read if don't want to. But I'm connecting into some remote host, and receiving it's text, if the text received begins with '+' symbol (default for POP3 servers), I return true... But when I try to do this inside Thread.Execute:</p>
  
  <pre><code> if CheckPOPHost = true then
      begin
        Form1.Memo1.Lines.Append('Valid HOST:: '+Host);
  </code></pre>
  
  <p>Just don't work. I think is good to remember, that if inside the function, instead of doing:</p>
  
  <pre><code>  if AnsiStartsStr('+', ReceivedText) then
      Result:= true;
  </code></pre>
  
  <p>I do:</p>
  
  <pre><code>  if AnsiStartsStr('+', ReceivedText) then
      Form1.Memo1.Lines.Append('Valid HOST:: '+Host);
  </code></pre>
  
  <p>It works normally... What's happening?!</p>
  
  <p><strong>Edit:: I'm getting error on 'if CheckPOPHost = true then' line. For some unknown reason it's giving Access Violation error.</strong></p>