Multi-Thread-Warteschlange in delphi?

Dies ist meine zweite Frage, ich habe einige Probleme mit diesem >.<

Gut, ich will einfach erstellen Sie eine begrenzte Anzahl von threads (in diesem Fall möchte ich 10 threads), und dann wird ein thread nach dem pick-up einen Namen in meiner Liste und erhalten Sie einige Daten in meine Website.

Mein system funktioniert Recht gut, aber meine multi-thread-system immer noch nicht =(

--

Habe ich versucht, den code gepostet von LU RD, aber der main-thread warten Sie nicht, die threads beenden der Warteschlange, und nur aufhört =(

Code:

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;

Meine andere Frage: Multi-Thread Delphi

Im mit Delphi XE3.

  • Bitte, fügen Sie code, um zu demonstrieren, Ihr problem. Code hier funktioniert ok.
  • OmniThreadLibrary hat beide thread-pools und-Sperre-weniger Multithread-queue-Klasse
  • RD, Das problem ist der Haupt-thread drücken Sie einfach auf null, bevor die threads, die die Arbeit machen. Ich weiß wirklich nicht warum =( .Mann, der thread-queue ist so schwer zu tun ._.
  • Wenn Sie drücken, werden alle Ihre jobs an die Warteschlange vor dem drücken der nil in der Warteschlange, es gibt keine chance, dass Sie aus dem consumer-threads. Bitte veranschaulichen dein problem, ansonsten ist es nicht möglich, Ihre Frage zu beantworten.
InformationsquelleAutor Kiritonito | 2013-04-25
Schreibe einen Kommentar