我是新來的線程,我有一個List包含一個字符串。我的目標是讓多個線程能夠工作到這個列表,這個代碼只針對單個線程,因爲我現在正在學習,但是當我按下開始按鈕時,我得到了AV。如何使一個Mutlithreded idhttp調用在StringList上工作
type
TDemoThread = class(TThread)
private
procedure Abort;
protected
procedure Execute; override;
public
List: TStringList;
end;
procedure TfrmMain.StartButton1Click(Sender: TObject);
var
i: integer;
List: Tstrings;
begin
for i := 0 to memo1.Lines.Count - 1 do
begin
List := TStringList.Create;
List.Add(memo1.Lines.Strings[i]);
end;
Thread := TDemoThread.Create(True);
Thread.FreeOnTerminate := True;
Thread.Start;
end;
procedure TDemoThread.Execute;
var
lHTTP: TIdHTTP;
i: integer;
X: Tstrings;
begin
inherited;
if Terminated then
Exit;
lHTTP := TIdHTTP.Create(nil);
X := TStringList.Create;
lHTTP.ReadTimeout := 30000;
lHTTP.HandleRedirects := True;
for i := 0 to List.Count - 1 do
try
X.Text := lHTTP.Get('https://instagram.com/' + List.Strings[i]);
S := ExtractDelimitedString(X.Text);
X.Clear;
TThread.Synchronize(nil,
procedure
begin
frmMain.Memo2.Lines.Add(List.Strings[i] + ' : ' + S);
end);
finally
end;
end;
建議:除非您確實需要使用它提供的所有擴展功能,否則不要使用TStringList。因爲該功能使其變慢。如果你所需要的只是一個愚蠢的累加器 - 那就用一個快得多的'TList' - 或者用一個'TThreadList '代替。然後使用表格上的'TTimer'將備忘錄追加到每秒2到3次的列表中。 /// 另外,我建議你看看第三方庫 - http://otl.17slon.com/tutorials.htm - 如果你想投入更多時間在多線程。請參閱Parrallel-For和ForJoin原語爲您的任務 –