Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.06.27;
Скачать: CL | DM;

Вниз

Многопоточное приложение   Найти похожие ветки 

 
scalich   (2004-05-14 06:37) [0]

Как можно динамически создать неограниченное число потоков? заранее thx


 
Ozone ©   (2004-05-14 07:33) [1]

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


 
Digitman ©   (2004-05-14 08:35) [2]


> создать неограниченное число потоков


неограниченное - никак


 
sclaich   (2004-05-14 10:16) [3]

условие такое, потому и надо. А если ограничить количество потоков как минимум пятью сотнями? Такое реально сделать?


 
Игорь Шевченко ©   (2004-05-14 10:22) [4]

И все-таки, зачем ?


 
sclaich   (2004-05-14 10:31) [5]

тупое условие лабы. "Количество нитей заранее не ограничено". Вот и сижу мучаюсь.


 
Viman ©   (2004-05-14 10:31) [6]

500 - реально, если ресурсов хватит, что во-первых просто не везде работать будет, во-вторых быстродействие таких потоков будет 0 - проц будет занят только переключением между потоками, в-третьих вроде бы даже MS не рекомендует создавать более 16 потоков в одном приложении - все правильно- все время проца уходит на переключение и синхронизацию.
У тебя что, сервер какой-то пишется?


 
Игорь Шевченко ©   (2004-05-14 10:39) [7]


> Как можно динамически создать неограниченное число потоков?
>


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.


 
Семен Сорокин ©   (2004-05-14 10:39) [8]

Как можно динамически создать неограниченное число потоков?

while true do
 TMyThread.Create(false)


:))


 
scalich   (2004-05-14 10:42) [9]

что-то в этом роде. в каждом потоке стандартные численные методы из высшей математики, причем несколько потоков должны работать с одним и тем же численным методом. А мощности хватит это на многопроцессорной системе работать будет. Тока скажите как такую кучу потоков завести.


 
Viman ©   (2004-05-14 10:45) [10]

Так оно заранее не ограниченно(теоретически), реально(при нормальной планировке задачи) у тебя, наверное, или появятся условия ограничения, или такого никогда не случиться(такое только для серверной части нужно обычно, да и то СУБД, какие-то  сетевые сервисы и т.п.), не волнуйся, только не забывай уже не нужные потоки корректно завершать и освобождать ресурсы.


 
Digitman ©   (2004-05-14 10:47) [11]


> sclaich   (14.05.04 10:16) [3]


for 1 to сколько_угодно do
 TMyDummyThread.Create(..);

только не удивляйся при этом, если на какой-то итерации цикла ты получишь исключение по невозможности создать очер.поток, потому что ты поставил систему в безвыходное положение и система вынуждена дать отлуп - слишком велики оказались твои аппетиты к ресурсам тек.процесса и системы в целом


 
Viman ©   (2004-05-14 10:51) [12]

Пока у меня поститься уже новые записи в форуме появляются :)
Никакю неопределенную кучу заводить не надо. По-моему количество должно задаваться как параметр. Единственно, что нужно проверять результат CreateThread - если не может больше создавать, то и не создавать :). И все.


 
Digitman ©   (2004-05-14 10:54) [13]


> sclaich


каждый вновь создаваемый поток TMyDummyThread потребует от системы как минимум выделения ресурсов ВАП процесса размером не менее чем thread_stack_size + MyDummyThread_instance_size

thread_stack_size по дифолту равен current_process_stack_size

вот и посчитай сам, сколько потоков ты реально сможешь создать, с учетом того, что в идеальных условиях (каковых никогда не будет) ты располагаешь 2Гб вирт.адр.пространства


 
scalich   (2004-05-14 21:35) [14]

я может чего не понимаю, но в эти потоки мне еще параметры в ходе их работы нужно передавать. а с подобными конструкциями я не смогу передавать сообщения в конкретный поток (к примеру 9-ый). Вся проблема как раз в том чтобы из главного потока можно было получить доступ к любому из работающих.


 
Игорь Шевченко ©   (2004-05-14 21:42) [15]


> но в эти потоки мне еще параметры в ходе их работы нужно
> передавать.  


Например, email получателя :))


 
scalich   (2004-05-14 21:50) [16]

:))


 
scalich   (2004-05-14 21:56) [17]

а в e-mail"e PostMessage валяется. В конце концов надо же как-то из главного потока остальные прерывать...


 
Игорь Шевченко ©   (2004-05-14 22:32) [18]


> я может чего не понимаю, но в эти потоки мне еще параметры
> в ходе их работы нужно передавать. а с подобными конструкциями
> я не смогу передавать сообщения в конкретный поток (к примеру
> 9-ый).


А кто мешает Handle созданного потока в список, например TList, поместить ? Потом хоть к девятому, хоть к 99-му обращаться.


 
Игорь Шевченко ©   (2004-05-14 22:33) [19]

Еще hint: параметры потоку удобно передавать через его переписанный конструктор.


 
scalich   (2004-05-17 22:18) [20]

сколько в книжку эту не смотрел - ничего не нашел, вот обратно и пришел. и про handle потока можно поподробнее, а лучше реализацию того как его узнать а потом и через него обратиться. потому как я что-то неправильно делаю и что понять не могу.


 
Игорь Шевченко ©   (2004-05-18 00:41) [21]

scalich   (17.05.04 22:18)

Есть встречное предложение - ты напиши, что ты уже сделал, а народ посмотрит, где есть ошибки, подскажет.


 
Digitman ©   (2004-05-18 08:16) [22]


> я что-то неправильно делаю и что понять не могу


действительно, ты покажи что уже сделал и что при этом не понял ..


 
scalich   (2004-05-18 11:04) [23]

type
 TMyThread= class(TThread)
 public
   hHandle : tHandle;
 protected
   procedure execute; override;
 end;

далее процедура execute и, к примеру, по нажатию кнопки срабатывает

TMyThread.Create(true).

Вопрос: handle этого потока надо задавать самому или он "задается автоматически, так же как и объектам синхронизации"? Но если он задается автоматически, то это значение всегда 0, а если задать его
как
with TMyThread.Create(true) do
  begin
   hHandle:=10;
   resume;
  end;        то при отправке этому потоку сообщения он на него никак не реагирует. Мне кажется что я как-то неправильно его handle использую, а без хелпа совсем плохо. :((


 
Игорь Шевченко ©   (2004-05-18 11:16) [24]


> handle этого потока надо задавать самому или он "задается
> автоматически, так же как и объектам синхронизации"?


Автоматически, при создании потока.
А вопрос такой - зачем он тебе, этот Handle потока ?


> а без хелпа совсем плохо


А куда help подевался ?


 
panov ©   (2004-05-18 11:32) [25]

http://delphimaster.net/view/4-1084530074/


 
scalich   (2004-05-18 14:10) [26]

Сами же советовали записывать handle потока в список или очередь и через него к потоку обращаться, в случае когда создается несколько потоков таким вот образом
for i:=1 to n do TMyThread.Create();
только вот handle у всех получается одинаковый и равный 0.

Кстати линк не работает - internal derver error


 
Digitman ©   (2004-05-18 15:45) [27]


> только вот handle у всех получается одинаковый и равный
> 0.

вот ты горемышный-то) ..

да на кой шут тебе хэндл в этом случае ? заведи список объектов типа TMyThread и храни там на здоровье ссылки на все созданные объекты класса TMyThread !

type
TMyThreads = array[1..n] of TMyThread;

var
 MyThreadList: TMyThreads;

for i:=1 to n do
MyThreadList[i] := TMyThread.Create();



Страницы: 1 вся ветка

Текущий архив: 2004.06.27;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.023 c
11-1075885983
andrey1
2004-02-04 12:13
2004.06.27
компактный аналог TStringList


6-1082631616
ultracrash
2004-04-22 15:00
2004.06.27
Как определить скорость интернета


6-1083582436
Amid
2004-05-03 15:07
2004.06.27
Создать Функцию каторая ждала сообщение от Сервера


14-1086847223
BiN
2004-06-10 10:00
2004.06.27
Личный вклад в историю или Кочубей не пройдет!!! :)


3-1086062889
Guma
2004-06-01 08:08
2004.06.27
Тип поля счетчик