71 lines
1.3 KiB
ObjectPascal
71 lines
1.3 KiB
ObjectPascal
// test logging when 6000 threads are created (per chunks of 20)
|
|
program thread512;
|
|
|
|
{$APPTYPE CONSOLE}
|
|
|
|
uses
|
|
{$ifdef MSWINDOWS}
|
|
Windows,
|
|
{$endif}
|
|
SynCommons,
|
|
SynLog,
|
|
mORMot,
|
|
Classes,
|
|
SysUtils;
|
|
|
|
type
|
|
TMyThread = class(TThread)
|
|
protected
|
|
procedure Execute; override;
|
|
end;
|
|
|
|
var
|
|
n: integer;
|
|
|
|
procedure SubProc;
|
|
begin
|
|
InterlockedIncrement(n);
|
|
TSynLog.Enter(nil,'SubProc').Log(sllDebug,'Thread #% (%)',[n,pointer(GetCurrentThreadID)]);
|
|
sleep(0);
|
|
end;
|
|
|
|
procedure TMyThread.Execute;
|
|
var n: TThreadID;
|
|
log: TSynLog;
|
|
begin
|
|
n := GetCurrentThreadId;
|
|
log := TSynLog.Add;
|
|
log.Log(sllTrace,'Entering thread %',[pointer(n)]);
|
|
SubProc;
|
|
log.Log(sllTrace,'Leaving thread %',[pointer(n)]);
|
|
log.NotifyThreadEnded;
|
|
end;
|
|
|
|
procedure Test;
|
|
var i,j: Integer;
|
|
t: array[1..20] of TMyThread;
|
|
begin
|
|
TSynLog.Enter;
|
|
for i := 1 to 300 do begin
|
|
for j := Low(t) to high(t) do
|
|
t[j] := TMyThread.Create(false);
|
|
for j := high(t) downto low(t) do
|
|
t[j].WaitFor;
|
|
for j := Low(t) to high(t) do
|
|
t[j].Free;
|
|
end;
|
|
end;
|
|
|
|
var Timer: TPrecisionTimer;
|
|
begin
|
|
TSynLog.Family.Level := LOG_VERBOSE;
|
|
TSynLog.Family.PerThreadLog := ptIdentifiedInOnFile;
|
|
TSynLog.Family.EchoToConsole := LOG_STACKTRACE;
|
|
Timer.Start;
|
|
Test;
|
|
writeln(n,' threads created in ',Timer.Stop);
|
|
{$ifdef MSWINDOWS}
|
|
readln;
|
|
{$endif}
|
|
end.
|