私は(再び)スレッドを使用していますが、これは常に苦痛です...スレッドクラス内に1つの関数があり、それはプライベートです。この関数は、1つのブール結果を返し、一部の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);
正常に動作します...何が起こっているのですか?!
編集::「CheckPOPHost=trueの場合」の行でエラーが発生します。なんらかの理由で、アクセス違反エラーが発生しています。