Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Многопоточное приложение [D6, WinXP]


Страницы:   1 2

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]

А оно тебе зачем?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо