MTProcs und Synchronize

Rund um die LCL und andere Komponenten
Antworten
Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

MTProcs und Synchronize

Beitrag von Scotty »

Die MTProcs haben leider kein Synchronize. Ohne das kann ich aber dem Benutzer nicht zeigen, dass noch was läuft (Progressbar) und ein Eingriff ist auch nicht möglich (Abbruch-Button). Jetzt dachte ich mir, dass ich einen eigenen Thread um die MTProcs herum bastle, aus dem heraus ich synchonisiere.

Code: Alles auswählen

constructor TProgressThread.Create(aParent:TBruteForce);
begin
  inherited Create(true);
  FreeOnTerminate:=true;
  FLastProgress:=0;
  FParent:=aParent;
  Resume;
end;
 
procedure TProgressThread.Execute;
begin
  while not Terminated do
  begin
    if FLastProgress<>FParent.Progress then
    begin
      FLastProgress:=FParent.Progress;
      Synchronize(@DoUpdate);
    end;
  end;
end;
 
procedure TProgressThread.DoUpdate;
begin
  if assigned(OnProgress) then OnProgress(nil,FLastProgress); //OnProgress wird auf die Mainform umgelenkt und zeichnet dort in den Statusbar
end; 
 
procedure TBruteForce.Run;
...
  with TProgressThread.Create(self) do                               
  try
    MyProcThreadPool:=TProcThreadPool.Create; 
    try
      MyProcThreadPool.DoParallel(@RunParallel,0,FProcessing.Count-1,nil);
    finally
      MyProcThreadPool.Free;
    end;
  finally
    Terminate;
  end;
...
end;
 
procedure TBruteForce.RunParallel(Index: PtrInt; Data: Pointer; Item: TMultiThreadProcItem);
begin
  FProgress:=round((index/FProcessing.Count)*100); //property Progress:byte read FProgress;
  TOperation(FProcessing[index]).Run;
end;
Das läuft zwar, aber es kommt nur einmal ein Wert in den TProgressThread. MTProcs blockiert scheinbar alles, und tpHighest hilft auch nicht. Denke ich prinzipiell falsch oder übersehe ich etwas?

Antworten