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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
DoSomeJob()
und block bereit, bis aus dem main-thread, es gibt eine Einschränkung. Wenn Ihr worker-threads synchronisieren mit dem Haupt-thread, dort ist ein dead-lock-situation mitaCounter.WaitFor
undTThread.Synchronize()
.Ich gehe davon aus, dass dies ist, was mit Ihnen geschieht, raten hier.
Es ist eine Art und Weise zu handhaben, die wie ich zeigen werde, in dieser Antwort.
Ich werde lassen Sie diese an Ihnen. Sobald das framework geschrieben ist, Gewindeschneiden einfacher sein wird. Wenn dies scheint Komplex, versuchen
OTL
threading-framework statt.Hier ist ein Beispiel, wo der main-thread warten kann
DoSomeJob()
in einer sicheren Art und Weise.Eine anonyme Threads warten, bis die
aCounter
zu signalisieren.Dieses Beispiel verwendet eine
TMemo
und einTButton
. Erstellen Sie einfach ein Formular mit diesen Komponenten und schließen Sie den buttonOnClick
event zu denButtonClick
Methode.