Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.06.27;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.06.27;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.57 MB
Время: 0.037 c
1-1086863999
Ruslan
2004-06-10 14:39
2004.06.27
Подскажите как сделать чтобы картинка на ToolButton занимала


3-1086058303
ИМХО
2004-06-01 06:51
2004.06.27
Открыть в FoxPro with memo в Delphi


1-1086763566
karlsn
2004-06-09 10:46
2004.06.27
Программно скроллировать текуст в tmemo


3-1086154029
Izyum
2004-06-02 09:27
2004.06.27
ODBC & ZEOS - что быстрее


3-1085822681
Den
2004-05-29 13:24
2004.06.27
ReIndex or AddIndex?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский