我正在将一个Delphi应用从Indy 9更新到Indy 10。
这是一个比较痛苦的过程,因为显然有很多变化。
我卡在了一个步骤上。
以下是旧代码(适用于Indy 9):
创建线程池并初始化每个线程,然后启动它们。每个线程创建一个Indy HTTP客户端(但这里并不重要)。
TUrlThread = class(TIdThread)
...
var
i: Integer;
begin
// create the Pool and init it
Pool := TIdThreadMgrPool.Create(nil);
Pool.PoolSize := Options.RunningThreads;
Pool.ThreadClass:= TUrlThread;
// init threads and start them
for i := 1 to Options.RunningThreads do
begin
with (Pool.GetThread as TUrlThread) do
begin
Index := i;
Controler := Self;
Priority := Options.Priority;
Start;
end;
end;
TIdThreadMgrPool 类已经在 Indy 10 中被取消。
我寻找了一个替代方案,TIdSchedulerOfThreadPool 看起来是一个不错的选择, 但我无法运行它。
以下是修改后(Indy 10)的代码:
TUrlThread = class(TIdThreadWithTask)
...
var
i: Integer;
begin
// create the Pool and init it
Pool := TIdSchedulerOfThreadPool.Create(nil);
Pool.PoolSize := Options.RunningThreads;
Pool.ThreadClass:= TUrlThread;
// init threads and start them
for i := 1 to Options.RunningThreads do
begin
with (Pool.NewThread as TUrlThread) do
begin
Index := i;
Controler := Self;
Priority := Options.Priority;
Start;
end;
end;
我在这里遇到一个访问冲突异常(这是indy代码):
procedure TIdTask.DoBeforeRun;
begin
FBeforeRunDone := True;
BeforeRun;
end;
FBeforeRunDone为空。