【发布时间】:2014-10-01 15:14:22
【问题描述】:
我用 Delphi 创建了一个 HTTP 服务器。为了测试服务器响应时间,我创建了一个生成随机 url 的 http 客户端应用程序。问题是当我开始向服务器发送请求时,其中的一部分正在被处理。这是我的代码的一部分:
正在执行此过程以开始发送请求:
procedure TPerformanceTestForm.ExecuteURLs;
var
requests: array of TRequestBuilder;
i: Integer;
Stopwatch: TStopwatch;
Elapsed: TTimeSpan;
begin
SetLength(requests, 10);
EnterCriticalSection(criticalSection);
Stopwatch := TStopwatch.StartNew;
for i := 0 to Length(requests) - 1 do
begin
requests[i] := TRequestBuilder.Create;
end;
// remove this lines from source in order to execute all threads
// for i := 0 to Length(requests) - 1 do
// begin
// requests[i].Terminate;
// end;
Elapsed := Stopwatch.Elapsed;
Seconds := Elapsed.TotalSeconds;
LeaveCriticalSection(criticalSection);
end;
procedure TPerformanceTestForm.btnStopQueriesClick(Sender: TObject);
var
i: Integer;
begin
for i := 0 to Length(requests) - 1 do
begin
// requests[i].WaitFor; // the program crashes
requests[i].Free;
end;
end;
这是 TRequestBuilder 类的一部分:
TRequestBuilder = class(TThread)
private
fHttpClient: TIdHTTP;
public
Constructor Create; reintroduce;
procedure Execute; override;
end;
Constructor TRequestBuilder.Create;
begin
inherited Create(False); // in order not to start another loop and call start for each instance
// FreeOnTerminate := True; // removed this line; see the first answer to know why
Self.fHttpClient := TIdHTTP.Create;
// HttpWorkBegin and HttWork I get from the first answer
Self.fHttpClient.OnWorkBegin := HttpWorkBegin;
Self.fHttpClient.OnWork := HttpWork;
end;
procedure TRequestBuilder.Execute;
var
request, response: string;
begin
repeat
try
request := GenerateHttpRequest;
response := Self.fHttpClient.Get(request);
log.AddJob(request + ' ---> ' + response + ' ---> ' +
FormatDateTime('dd.mm.yyyy hh:mm:ss', Now));
except
on e: Exception do
begin
errlog.Add(FormatDateTime('dd.mm.yyyy hh:mm:ss', Now) + ' ---> ' +
e.Message);
end;
end;
until (Terminated);
end;
// EDIT: change Execute procedure to avoid socket errors (removed the httpClient from class variables):
procedure TRequestBuilder.Execute;
var
request, response: string;
httpClient: TIdHTTP;
begin
repeat
try
httpClient := TIdHTTP.Create;
try
request := GenerateHttpRequest;
response := httpClient.Get(request);
log.AddJob(request + ' ---> ' + response + ' ---> ' +
FormatDateTime('dd.mm.yyyy hh:mm:ss', Now));
finally
httpClient.Free;
end;
except
on e: Exception do
begin
errlog.Add(FormatDateTime('dd.mm.yyyy hh:mm:ss', Now) + ' ---> ' +
e.Message);
end;
end;
until (Terminated);
end;
**编辑:** 当我停止 http 客户端时,我收到此错误:模块 App.exe 中地址 004083A0 的访问冲突。读取地址 FFFFFFFC。
**编辑:** 我删除了 ExecutreURLs 中的第二个 for 循环,现在程序运行良好(有时会引发异常)。我现在的问题是:当我不终止 ExecuteURLs 过程中的请求时,程序是否会泄漏内存?
**编辑:** 当我从执行过程中删除重复直到循环时,程序工作正常(仅抛出第一次编辑中的异常)。当我添加重复直到循环并从 btnStopQueries onclick 事件中删除时,我得到了几个套接字错误
【问题讨论】:
-
您遇到了什么错误?你需要更具体。
-
@RemyLebeau 错误出现在 OnFormDestroy 中,我已修复,但我忘记更新问题
标签: delphi http memory-leaks indy indy10