manchmal möchte man beim Debuggen einen Haltepunkt haben , z.B. in einer For-Schleife und findet keine passende Codestelle um diesen zu setzten.
Siehe z.B. im Quelltext unten in der Button1Click .
******
Bisher habe ich dann an der gewünschten Halte-Stelle einfach ein sleep(0); eingebaut , das funzt auch ganz gut.
Siehe z.B. im Quelltext unten in der Button2Click .
Man sollte aber nicht vergessen , nach der Benutzung dieses sleep(0); auch wieder auszuklammern.
Es kann sonst zu bösen Laufzeitverzögerungen kommen , besonders dann , wenn die Routine 1000fach benutzt wird.
******
Habe dann mal anstelle von
sleep(0);
ein
asm nop; end;
eingebaut .
Siehe z.B. im Quelltext unten in der Button3Click .
Das funzt sehr gut .
Sollte man nun das Ausklammern vergessen , ergibt sich kaum ein Laufzeitverlust .
(asm nop; end;) ist aber mit einem Haufen Schreibarbeit verbunden.
******
Leider kennt Freepascal kein NOP (außerhalb von asm), oder ich habe es nicht gefunden !
Deshalb habe ich mir dann eine Mini-Procedure gebaut.
// Dummy nop-Procedure
procedure nop; begin end;
Das benutze ich dann im im Quelltext unten in der Button4Click .
Dann einfach an der gewünschten Stelle ein
nop;
eintragen und den Haltepunkt drauf setzten.
Auch das funzt gut und die Laufzeit ist kaum länger als die (asm nop; end;) Methode.
Am besten ist es natürlich , wenn man den Dummy-Haltepunkt nach der Benutzung wieder ausklammert.
Frage:
Wie macht ihr das , gibt es etwas besseres ?
Gruß
Frank
Anbei das Test-Projekt :
Code: Alles auswählen
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Button3: TButton;
Button4: TButton;
Button2: TButton;
Edit1: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit2: TEdit;
Edit6: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
public
function schritte:integer;
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
// Dummy nop-Procedure
procedure nop; begin end;
{ TForm1 }
// Anzahl Schritte lesen
function TForm1.schritte: integer;
begin
result:=strtoint(Edit6.text);
end;
// ohne nop
procedure TForm1.Button1Click(Sender: TObject);
var i,j:integer;
s,e,d:qword;
begin
edit1.text:='';
edit1.Update;
s:=gettickcount64;
j:=0;
for i:=1 to schritte do
begin
inc(j);
end; // <--- Hier ein Haltepunkt funzt leider nicht
// Die IDE und der Debugger ignorieren das
e:=gettickcount64;
d:=e-s;
edit1.text:=inttostr(d);
end;
// mit sleep(0) , als Halte-Punkt-Dummy
procedure TForm1.Button2Click(Sender: TObject);
var i,j:integer;
s,e,d:qword;
begin
Edit2.text:='';
Edit2.Update;
s:=gettickcount64;
j:=0;
for i:=1 to schritte do
begin
inc(j);
sleep(0); // <--- Meine bisherige Vogehensweise für einen Dummy-Haltepunkt , weil mir nichts besseres eingefallen war
// Sollte aber nach Benutzung ausgeklammert werden , wegen recht großen Laufzeitverzögerungen !!!!
end;
e:=gettickcount64;
d:=e-s;
Edit2.text:=inttostr(d);
end;
//mit asm-nop
procedure TForm1.Button3Click(Sender: TObject);
var i,j:integer;
s,e,d:qword;
begin
Edit3.text:='';
Edit3.Update;
s:=gettickcount64;
j:=0;
for i:=1 to schritte do
begin
inc(j);
asm nop; end; // <--- Das hier als Haltepunkt-Dummy funzt gut , ist aber viel Schreiberei
// Auch wenn man es vergisst auszuklammern , hat es kaum Laufzeitnachteile
end;
e:=gettickcount64;
d:=e-s;
Edit3.text:=inttostr(d);
end;
// mit procedure-nop
procedure TForm1.Button4Click(Sender: TObject);
var i,j:integer;
s,e,d:qword;
begin
Edit4.text:='';
Edit4.Update;
s:=gettickcount64;
j:=0;
for i:=1 to schritte do
begin
inc(j);
nop; // <--- Das hier als Haltepunkt-Dummy funzt auch gut , mit wenig Schreiberei
// Auch wenn man es vergisst auszuklammern , ist die Laufzeit minimal länger als asm; nop, end;
end;
e:=gettickcount64;
d:=e-s;
Edit4.text:=inttostr(d);
end;
end.