blob: 45e8332be553ffd5f4b40a8c127cabd2700b56d4 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
{ %skiptarget=go32v2 }
program MaxThread;
{$mode objfpc}{$H+}
uses
{$ifdef unix}
cthreads,
{$endif}
Classes, SysUtils;
{ add your units here }
type
ThProva = class(TThread)
private
Number: Integer;
protected
procedure Execute; override;
public
constructor Create(ThreadNumber: Integer);
end;
var
threadsfinished: Integer;
constructor ThProva.Create(ThreadNumber: Integer);
begin
self.Number:= ThreadNumber;
self.FreeOnTerminate:= true;
inherited Create(true);
end;
procedure ThProva.Execute;
begin
WriteLn('I am the thread number '+ IntToStr(Number));
Terminate;
{ not exactly finished yet, but good enough }
interlockedincrement(threadsfinished);
end;
var
ThreadNumber: Integer;
thr: thprova;
begin
ThreadNumber:= 0;
WriteLn('Begin');
{ needs to be > 410 because at least on Mac OS X and Linux you can start }
{ about 400 threads before you run into trouble if they aren't finished }
while (threadnumber < 500) do
begin
try
Inc(ThreadNumber);
thr:=ThProva.Create(Threadnumber);
thr.resume;
Except on e: Exception do
begin
WriteLn(e.Message);
halt(1);
end;
end;
if (threadnumber mod 16) = 0 then
while (threadsfinished<>threadnumber) do
{ let the started threads to finish }
sleep(70);
end;
while (threadsfinished<>threadnumber) do
{ give some time to the started threads to finish }
sleep(100);
sleep(200)
end.
|