Это мой второй вопрос об этом, у меня есть некоторые проблемы с этим>. <Многопоточная очередь в delphi?
Ну, я просто хочу создать ограниченное количество потоков (в данном случае, я хочу 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
Im используя Delphi XE3.
Пожалуйста, добавляйте код, чтобы продемонстрировать вашу проблему. Код здесь работает нормально. –
OmniThreadLibrary имеет как пулы потоков, так и неблокируемый многопоточный класс очереди –
@LU RD. Проблема заключается в том, что основной поток просто нажимает nil до того, как потоки выполняют работу. Я действительно не знаю, почему = (очередь потоков .Man настолько сложна. 0. – Kirito94