我正在使用線程(再次),這總是痛苦的...我有一個函數在我的線程類,它是私人的。該函數返回一個布爾結果,以檢查某個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然後'行。由於某些未知原因,它提供了訪問衝突錯誤。
在調試器下通過什麼來告訴你?你可以做到這一點。我們不可以。 –
這是什麼PAnsiChar的事情?你爲什麼不使用AnsiString和AnsiChar? –
使用'File-> New-> Other-> Thread'時,自動讀取由IDE放置的註釋。它特別告訴你**不**從你的線程訪問GUI控件而不使用'Synchronize'。請注意單詞*** not ***,這正是您在線程中使用「Form1.Memo1」時所忽略的內容。 –