I can't do that. My technic doesn't work.
procedure TCustomThread.MonitorHook(Sender: TObject; Writing: boolean; const Buffer: Pointer; Len: Integer);
var i:integer=0;
begin
i:=i+1;
if i=ProgressRefreshRate then begin
Synchronize(@ShowProgress);
i:=0;
end;
end;
Note that, as it is, your code is completely equivalent to this:
procedure TCustomThread.MonitorHook(Sender: TObject; Writing: boolean; const Buffer: Pointer; Len: Integer);
begin
if 1 = ProgressRefreshRate then
Synchronize(@ShowProgress);
end;
Your code would work if you did it like:
procedure TCustomThread.MonitorHook(Sender: TObject; Writing: boolean; const Buffer: Pointer; Len: Integer);
const
i:integer = 0;
begin
i := i+1;
if i = ProgressRefreshRate then begin
Synchronize(@ShowProgress);
i:=0;
end;
end;
But that would only ever trigger the
if just once, unless you change
ProgressRefreshRate elsewhere before this is called. If it's indeed a "rate" (that is, if you mean the
if condition to be true, say, each 10 interations) you should do it, for example, like:
procedure TCustomThread.MonitorHook(Sender: TObject; Writing: boolean; const Buffer: Pointer; Len: Integer);
const
i:integer = 0;
begin
i := i+1;
if (i mod ProgressRefreshRate) = 0 then begin
Synchronize(@ShowProgress);
if i >= 100 then i:=0;
end;
end;