unit Unit10;
interface
uses
Winapi.Windows,
Winapi.Messages, System.SysUtils, System.Variants,
System.Classes,
Vcl.Graphics,
Vcl.Controls,
Vcl.Forms,
Vcl.Dialogs,
Vcl.StdCtrls,
Vcl.ExtCtrls;
type
TForm10 =
class(TForm)
Timer1: TTimer;
Label1: TLabel;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
procedure CreateOneThread;
procedure CreateThreads(Count: Integer);
public
{ Public declarations }
end;
var
Form10: TForm10;
implementation
{$R *.dfm}
var
CurrentThreadCount: Integer;
const
CREATE_MANY_THREADS = 50000;
THREADS_STACK_SIZE = 64 * 1024;
STACK_SIZE_PARAM_IS_A_RESERVATION = $00010000;
function ThreadFunc(Parameter: Pointer): Integer;
begin
InterlockedIncrement(CurrentThreadCount);
Sleep(4000);
InterlockedDecrement(CurrentThreadCount);
EndThread(0);
end;
procedure TForm10.FormCreate(Sender: TObject);
begin
Timer1.Interval := 50;
end;
procedure TForm10.CreateOneThread;
var
ThreadId: Cardinal;
ThreadHandle: THandle;
begin
ThreadHandle := BeginThread(
nil, THREADS_STACK_SIZE, Addr(ThreadFunc), 0, STACK_SIZE_PARAM_IS_A_RESERVATION, ThreadId);
if ThreadHandle <> 0
then
CloseHandle(ThreadHandle);
end;
procedure TForm10.CreateThreads(Count: Integer);
begin
while Count > 0
do
begin
CreateOneThread;
Dec(Count);
end;
end;
procedure TForm10.Button1Click(Sender: TObject);
begin
if IsDebuggerPresent
then
CreateThreads(10)
else
CreateThreads(CREATE_MANY_THREADS);
end;
procedure TForm10.Timer1Timer(Sender: TObject);
begin
Label1.Caption := IntToStr(CurrentThreadCount);
end;
end.