Я обычно делаю так. Загоняю алгоритм в поток по окончанию поток ликвидируется и можно посмотреть время его работы.
| Код | unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, FFT, RealFFT, Math;
type TFFT = class(TThread) protected procedure Execute; override; public procedure FOnTerminate(Sender: TObject); end;
TForm1 = class(TForm) Button1: TButton; Label1: TLabel; LabeledEdit1: TLabeledEdit; Memo1: TMemo; procedure Button1Click(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormCreate(Sender: TObject); private procedure Generator; public { Public declarations } end;
var Form1: TForm1; N: Cardinal; aFFT: TFFT; Signal: TReal1DArray; Fi, Mag: Array[0..7] of Double;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); begin Button1.Caption := 'Стоп'; if aFFT <> Nil then begin aFFT.Free; aFFT := Nil; end;
aFFT := TFFT.Create(True); //aFFT.Priority := tpTimeCritical; // Максимальный приоритет потока aFFT.OnTerminate := aFFT.FOnTerminate; N := StrToInt(LabeledEdit1.Text); Signal := Nil; SetLength(Signal, N); Generator; aFFT.Resume; end;
procedure TForm1.Generator; var I, I1: Integer; begin for I := 0 to N - 1 do Signal[I] := 0; for I := 0 to N - 1 do for I1 := 1 to 8 do Signal[I] := Signal[I] + I1 * Sin(2 * Pi * I * I1 / N + I1 * Pi / 180); end;
{ TFFT }
procedure TFFT.Execute; var II, I, I1, nn: Integer; a, wRe, wIm, Re, Im, F, V0, V1, V2, k: Double; begin for II := 0 to 7 do begin nn := N; k := II + 1; F := 2 * Pi * k / nn; wRe := Cos(F); wIm := -Sin(F); a := 2 * wRe;
V0 := Signal[0]; V1 := Signal[1] + a * V0; V2 := Signal[2] + a * V1 - V0;
I1 := 0; for I := 0 to nn div 3 - 2 do begin Inc(I1, 3); V0 := Signal[I1] + a * V2 - V1; V1 := Signal[I1 + 1] + a * V0 - V2; V2 := Signal[I1 + 2] + a * V1 - V0; end;
Re := V2 * wRe - V1; Im := V2 * wIm;
MAG[II] := 2 * Sqrt(Re * Re + Im * Im) / nn; Fi[II] := 90 - ArcTan2(Im, Re) * (180 / Pi); if Fi[II] > 180 then Fi[II] := Fi[II] - 360; end; end;
procedure TFFT.FOnTerminate(Sender: TObject); var lpCreationTime, loExitTime, lpKernelTime, lpUserTime: TFileTime; I: Integer; begin GetThreadTimes(aFFT.Handle,lpCreationTime, loExitTime, lpKernelTime, lpUserTime); Form1.Label1.Caption := 'Время: ' + FloatToStr(Int64(lpUserTime) / 10000) + ' мс'; Form1.Memo1.Clear; for I := 0 to 7 do begin Form1.Memo1.Lines.Add('MAG = ' + FloatToStr(Round(MAG[I] * 100) / 100)); Form1.Memo1.Lines.Add('Fi = ' + FloatToStr(Round(Fi[I] * 100) / 100)); Form1.Memo1.Lines.Add(''); end; Form1.Button1.Caption := 'Старт'; end;
procedure TForm1.FormDestroy(Sender: TObject); begin if aFFT <> Nil then aFFT.Free; Signal := Nil; end;
procedure TForm1.FormCreate(Sender: TObject); begin //if not SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS) then // максимальный приоритет //ShowMessage('Ошибка.'); end;
end.
|
Про память как то не задумывался. |