Es hat mich nicht ganz losgelassen, daher hier mal ein Beispiel das Primzahlen sucht. Ja, die Berechnung ist absichtlich langsam, wobei ich nicht schätzen kann, wie langsam
(Und ich hab das ohne
IDe hingetippt, vll. sind da noch kleine Fehler drin)
Der Thread ist (bzgl. Abhängigkeiten) entkoppelt von der UI und steltl nur ein Event zur Verfügung. die UI kann (am Besten in einer anderen
unit) dann das Event abonnieren und den Fortschritt anzeigen.
Delphi-Quellcode:
type
TPrimeInfoEvent = procedure(Sender: TPrimeFinderThread; number: Integer) of Object;
TPrimeFinderThread = class(TThread)
private
testNumber: Integer;
isPrime: Boolean;
protected
procedure Execute; override;
procedure ShowProgress;
function IsNumberPrime(number: Integer);
fProgressCallback: TPrimeInfoEvent;
public
{ Public-Deklarationen }
constructor Create(Form1: TForm1);
end;
implementation
constructor PrimeFinderThread.Create(callback: TPrimeInfoEvent);
begin
inherited Create(False);
Self.fProgressCallback = callback;
FreeOnTerminate := True;
end;
procedure PrimeFinderThread.Execute;
begin
testNumber = 10000;
while not Terminated and testNumber < 1e7 do
begin
if IsNumberPrime(testNumber) then
Synchronize(ShowProgress);
testNumber := testNumber+1;
end;
end;
procedure PrimeFinderThread.ShowProgress;
begin
fProgressCallback(Self, testNumber);
end;
function PrimeFinderThread.IsNumberPrime(number: Integer): Boolean;
var
i: Integer;
divisorCount: Integer;
remainder: Integer;
begin
divisorCount := 0;
for i := 1 to number do
begin
remainder := number;
while remainder >= i do { remainder := number mod i }
begin
remainder := remainder - i;
end
if remainder = 0 then
inc(divisorCount);
end
Result := divisorCount = 2;
end;
end.