我正在使用线程(再次),这总是很痛苦......我的线程类中有一个函数,它是私有的。该函数返回一个布尔结果,以检查某个 POP3 服务器是否有效。检查正在工作,我对其进行了测试,并且看起来至少可以工作,但是当我在 Thread.Execute 过程中尝试访问结果时遇到问题。我会解释更多,让我们去代码吧。 . 这里是声明:
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;
所以函数是这样的:
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)) <> 0) do
ReceivedText:= ReceivedText + Buffer;
if Length(ReceivedText) > 0 then
ReceivedText:= PAnsiChar(ReceivedText);
if AnsiStartsStr('+', ReceivedText) then
Result:= true;
end;
SockStream.Free;
MySocket.Free;
end;
因此,如果您不想阅读,则无需阅读。但是我正在连接到某个远程主机,并接收它的文本,如果接收到的文本以“+”符号开头(POP3 服务器的默认值),我返回 true...但是当我尝试在 Thread.Execute 中执行此操作时:
if CheckPOPHost = true then
begin
Form1.Memo1.Lines.Append('Valid HOST:: '+Host);
只是不工作。我认为最好记住,如果在函数内部,而不是这样做:
if AnsiStartsStr('+', ReceivedText) then
Result:= true;
我愿意:
if AnsiStartsStr('+', ReceivedText) then
Form1.Memo1.Lines.Append('Valid HOST:: '+Host);
它工作正常......发生了什么?!
编辑:: 我在 'if CheckPOPHost = true then' 行出现错误。由于某些未知原因,它给出了访问冲突错误。