【发布时间】:2016-09-04 13:26:49
【问题描述】:
我需要帮助来加快我的项目,我有 2 个 ListBox,第一个充满了 URL,第二个我在其中存储了导致 Listbox1 出现 404 错误的 URL,它只是检查过程。 idhttp 需要大约 2 秒来检查 1 个 url,我不需要 html,因为解密过程需要时间,所以我决定在我的项目中添加线程,我的代码到目前为止
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
IdSSLOpenSSL, Vcl.StdCtrls, IdBaseComponent, IdComponent,
IdTCPConnection, IdTCPClient, IdHTTP;
type
TForm1 = class(TForm)
IdHTTP1: TIdHTTP;
Button1: TButton;
ListBox1: TListBox;
ListBox2: TListBox;
Button3: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
public
end;
Type
TMyThread = class(TThread)
IdHTTP1: TIdHTTP;
Button1: TButton;
ListBox1: TListBox;
ListBox2: TListBox;
Button3: TButton;
Memo1: TMemo;
private
fStatusText : string;
lHTTP: TIdHTTP;
protected
procedure Execute; override;
public
Constructor Create(CreateSuspended : boolean);
end;
var
Form1: TForm1;
procedure TForm1.Button3Click(Sender: TObject);
var
MyThread : TMyThread;
begin
MyThread := TMyThread.Create(True);
MyThread.Start;
end;
constructor TMyThread.Create(CreateSuspended : boolean);
var
s: string;
IdSSL : TIdSSLIOHandlerSocketOpenSSL;
begin
FreeOnTerminate := True;
inherited Create(CreateSuspended);
lHTTP := TIdHTTP.Create(nil);
IdSSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
try
lHTTP.ReadTimeout := 30000;
lHTTP.IOHandler := IdSSL;
IdSSL.SSLOptions.Method := sslvTLSv1;
IdSSL.SSLOptions.Method := sslvTLSv1;
IdSSL.SSLOptions.Mode := sslmUnassigned;
lHTTP.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(lHTTP);
lHTTP.HandleRedirects := True;
finally
end;
end;
destructor TMyThread.Destroy;
begin
inherited;
end;
procedure TMyThread.Execute;
var
s: string;
i: Integer;
satir: Integer;
str: TStringList;
newStatus : string;
begin
fStatusText := 'TMyThread Starting...';
Synchronize(Showstatus);
fStatusText := 'TMyThread Running...';
while (not Terminated) do
begin
for i:= 0 to satir-1 do
begin
try
lHTTP.Get('http://website.com/'+ListBox1.Items.Strings[i]);
Memo1.Lines.Add(ListBox1.Items[i])
except
on E: EIdHTTPProtocolException do
begin
if E.ErrorCode <> 404 then
raise;
ListBox2.Items.Add(ListBox1.Items[i]);
end;
end;
end;
end;
if NewStatus <> fStatusText then
begin
fStatusText := newStatus;
Synchronize(Showstatus);
end;
end;
procedure TMyThread.ShowStatus;
begin
Form1.Caption := fStatusText;
end;
end.
现在当我点击按钮 3 时,表单标题变为 TMyThread is Starting...,之后没有任何反应!请查看代码,非常感谢。
【问题讨论】:
-
你的代码一团糟。首先,修复格式。然后添加其余部分(您声明
TMyThread = class(TThread)的部分。 -
好的,完成@KenWhite
-
请了解如何正确格式化您的代码(在此处和在您的代码编辑器中)。正确缩进代码可以更容易阅读和理解。
-
您的代码有很多问题,首先是从
TMyThread.Execute中访问 UI 控件。此外,计算您声明的 TIdHTTP 和 TIdSSL 变量的数量(在表单级别、线程类级别,以及在代码中作为局部变量的两次),然后计算您实际用于执行任何操作的数量。注意到一个问题(比如声明比您需要的多三到四倍)? -
我撤回了您的编辑,因为它不合适。在您收到问题的答案后,您无法进行实质性更改问题的编辑。编辑可以完全改变问题的含义,使您收到的答案无效。如果您有新问题,请发布新问题。
标签: delphi vcl delphi-10-seattle idhttp