![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Многопоточное приложение [D6, WinXP]
scalich © (2004-05-14 06:37:00)Как можно динамически создать неограниченное число потоков? заранее thx
Игорь Шевченко (2004-05-14 10:39:00) [21]
> Как можно динамически создать неограниченное число потоков?
>
CreateThread.
или на VCL:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Label1: TLabel;
Button1: TButton;
StaticText1: TStaticText;
Label2: TLabel;
Timer1: TTimer;
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure Timer1Timer(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure Button1Click(Sender: TObject);
private
_ActiveThreads: integer;
public
procedure AddActiveThread;
procedure DecActiveThread;
end;
var
Form1: TForm1 = nil;
implementation
uses Unit2;
{$R *.dfm}
type
TDummyThread = class(TThread)
protected
procedure Execute; override;
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if not(Key in ['0'..'9', Char(VK_BACK)]) then
Key := #0;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
StaticText1.Caption := IntToStr(_ActiveThreads);
end;
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose := (_ActiveThreads = 0);
end;
{ TDummyThread }
procedure TDummyThread.Execute;
const
MinSleepTime = 3000;
MaxSleepTime = 25000;
var
ObjHandle: cardinal;
begin
Form1.AddActiveThread;
try
ObjHandle := CreateObject;
Sleep(MinSleepTime + Random(MaxSleepTime - MinSleepTime));
FreeObject(ObjHandle);
finally
Form1.DecActiveThread;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
NewThreadsNr: integer;
i: integer;
begin
NewThreadsNr := StrToInt(Edit1.Text);
for i := 1 to NewThreadsNr do
begin
with TDummyThread.Create(TRUE) do
begin
FreeOnTerminate := TRUE;
Resume;
end;
Application.ProcessMessages;
end;
end;
procedure TForm1.AddActiveThread;
begin
InterlockedIncrement(_ActiveThreads);
end;
procedure TForm1.DecActiveThread;
begin
InterlockedDecrement(_ActiveThreads);
end;
initialization
Randomize;
finalization
end.
Viman (2004-05-14 10:31:00) [22]500 - реально, если ресурсов хватит, что во-первых просто не везде работать будет, во-вторых быстродействие таких потоков будет 0 - проц будет занят только переключением между потоками, в-третьих вроде бы даже MS не рекомендует создавать более 16 потоков в одном приложении - все правильно- все время проца уходит на переключение и синхронизацию.
У тебя что, сервер какой-то пишется?
sclaich (2004-05-14 10:31:00) [23]тупое условие лабы. "Количество нитей заранее не ограничено". Вот и сижу мучаюсь.
Игорь Шевченко (2004-05-14 10:22:00) [24]И все-таки, зачем ?
sclaich (2004-05-14 10:16:00) [25]условие такое, потому и надо. А если ограничить количество потоков как минимум пятью сотнями? Такое реально сделать?
Digitman (2004-05-14 08:35:00) [26]
> создать неограниченное число потоков
неограниченное - никак
Ozone (2004-05-14 07:33:00) [27]А оно тебе зачем?