【发布时间】:2013-04-18 19:11:45
【问题描述】:
这是我的第二个问题,我遇到了一些麻烦>.
好吧,我只想创建有限数量的线程(在本例中,我想要 10 个线程),然后每个线程将在我的列表中选择一个名称并在我的站点中获取一些数据。
我的系统运行良好,但我的多线程系统仍然失败 =(
--
我尝试了LU RD发布的代码,但是主线程不等待线程完成队列,而是停止=(
代码:
uses
Classes,SyncObjs,Generics.Collections;
Type
TMyConsumerItem = class(TThread)
private
FQueue : TThreadedQueue<TProc>;
FSignal : TCountDownEvent;
protected
procedure Execute; override;
public
constructor Create( aQueue : TThreadedQueue<TProc>; aSignal : TCountdownEvent);
end;
constructor TMyConsumerItem.Create(aQueue: TThreadedQueue<TProc>; aSignal : TCountDownEvent);
begin
Inherited Create(false);
Self.FreeOnTerminate := true;
FQueue := aQueue;
FSignal := aSignal;
end;
procedure TMyConsumerItem.Execute;
var
aProc : TProc;
begin
try
repeat
FQueue.PopItem(aProc);
if not Assigned(aProc) then
break; // Drop this thread
aProc();
until Terminated;
finally
FSignal.Signal;
end;
end;
procedure DoSomeJob(myListItems : TStringList);
const
cThreadCount = 10;
cMyQueueDepth = 100;
var
i : Integer;
aQueue : TThreadedQueue<TProc>;
aCounter : TCountDownEvent;
function CaptureJob( const aString : string) : TProc;
begin
Result :=
procedure
begin
// Do some job with aString
end;
end;
begin
aQueue := TThreadedQueue<TProc>.Create(cMyQueueDepth);
aCounter := TCountDownEvent.Create(cThreadCount);
try
for i := 1 to cThreadCount do
TMyConsumerItem.Create(aQueue,aCounter);
for i := 0 to myListItems.Count-1 do begin
aQueue.PushItem( CaptureJob( myListItems[i]));
end;
finally
for i := 1 to cThreadCount do
aQueue.PushItem(nil);
aCounter.WaitFor; // Wait for threads to finish
aCounter.Free;
aQueue.Free;
end;
end;
我的另一个问题:Multi Thread Delphi
我正在使用 Delphi XE3。
【问题讨论】:
-
请添加代码来演示您的问题。这里的代码工作正常。
-
OmniThreadLibrary 同时拥有线程池和无锁多线程队列类
-
@LU RD,问题是主线程只是在线程完成工作之前压入 nil。真不知道为什么=(.Man线程队列这么难做._.
-
如果您在将 nil 推送到队列之前将所有作业推送到队列,那么您不可能耗尽消费者线程。请举例说明您的问题,否则无法回答您的问题。
标签: multithreading delphi queue