Managing TLS correctly with all kinds of dynamic storage seems to be a nightmare.
From what I think it’s safe to use a TStopWatch
[WayBack] System.Diagnostics.TStopwatch
(introduced in Delphi XE2) as threadvar
(which gets into TLS: Thread-local storage) because it’s a record type and as a bonus will be zero-initialised in something like this:
threadvar
ThreadStopwatch: TStopwatch; // threadvars are zero-initialised, like TStopwatch.Reset was called. Ensure TStopwatch.InitStopwatchType called before using this.
... thread code:
var
lThreadElapsedMilliseconds: string;
begin
...
if not ThreadStopwatch.IsRunning then
ThreadStopwatch.Start;
try
lThreadElapsedMilliseconds := ThreadStopwatch.ElapsedMilliseconds.ToString();
// log duration of call-to-call somewhere
... logic
lThreadElapsedMilliseconds := ThreadStopwatch.ElapsedMilliseconds.ToString();
// log duration of logic somewhere
finally
ThreadStopwatch := TStopwatch.StartNew; // resets new count
end;
As long as I perform this in the main thread somwehere to pre-initialise the class variable, then no thread should have the penalty for that:
TStopwatch.Create(); // ensures non-public TStopwatch.InitStopwatchType is called, enabling the threadvar ThreadStopwatch get the penalty for that
If I ever need to dig deeper into TLS with Delphi, then these are starters:
–jeroen
Like this:
Like Loading...