Ich steh immer noch auf dem Schlauch. Habe den Zugriff mit eine CS geschützt.
In dieser CS übertrage ich meine Daten an eine TQueue (Das erste mal dass ich mit Generics gearbeitet habe
) damit die Blockierung auf ein zeitliches Minimum begrenzt bleibt. Allerdings blockiert das Abarbeiten der Queue die Funktion und es gehen immer noch Werte 'verloren'.
Delphi-Quellcode:
type
TValueQueue = TQueue<Integer>;
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
FMyThread: TMyThread;
FValueQueue: TValueQueue;
procedure progress(value: Integer);
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Clear;
FValueQueue := TValueQueue.Create;
FMyThread := TMyThread.Create(true);
FMyThread.Progress := progress;
FMyThread.Resume;
end;
procedure TForm1.progress(value: Integer);
begin
FMyThread.SyncCS.Enter;
FValueQueue.Enqueue(value);
FMyThread.SyncCS.Leave;
while FValueQueue.Count > 0 do
begin
Memo1.Lines.Add('Value: ' + IntToStr(FValueQueue.Dequeue));
sleep(500);
end;
end;
Delphi-Quellcode:
type
TProgress = procedure(Value: integer) of object;
type
TMyThread = class(TThread)
private
FValue: Integer;
FProgress: TProgress;
FSyncCS: TCriticalSection;
procedure SyncProgress;
protected
procedure Execute; override;
public
property Progress: TProgress write FProgress;
property SyncCS: TCriticalSection read FSyncCS;
end;
implementation
uses
Windows, SysUtils;
{ TMyThread }
procedure TMyThread.Execute;
var
i: Integer;
begin
FSyncCS := TCriticalSection.Create;
for i := 1 to 10 do
begin
FSyncCS.Enter;
FValue := i;
FSyncCS.Leave;
Queue(SyncProgress);
sleep(200);
end;
//if assigned(FSyncCS) then
// FreeAndNil(FSyncCS);
end;
procedure TMyThread.SyncProgress;
begin
FProgress(FValue);
end;
Wie mache ich es richtig(er)?