【发布时间】:2016-08-23 08:46:32
【问题描述】:
我是线程新手,我有一个包含字符串的列表。我的目标是让多个线程对这个列表起作用,这个代码只用于一个线程,因为我目前正在学习,但是当我按下开始按钮时我得到了 AV。
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<string>- 或者可能是TThreadList<string>。然后在您的表单上使用TTimer以每秒 2 或 3 次将您的备忘录赶上该列表。 /// 另外,如果您想在多线程上投入更多时间,我建议您查看第三方库 - otl.17slon.com/tutorials.htm。请参阅 Parrallel-For 和 ForJoin 原语以了解您的任务
标签: multithreading http delphi delphi-xe8