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


Digitman   (2004-05-18 15:45:00) [1]


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

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

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

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

var
 MyThreadList: TMyThreads;

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


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

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

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


panov   (2004-05-18 11:32:00) [3]

http://www.delphimaster.ru/cgi-bin/forum.pl?id=1084530074&n=5


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


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


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


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


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


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

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 использую, а без хелпа совсем плохо. :((


Digitman   (2004-05-18 08:16:00) [6]


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


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


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

scalich   (17.05.04 22:18)

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


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

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


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

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


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


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


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


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

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


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

:))


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


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


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


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

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


Digitman   (2004-05-14 10:54:00) [15]


> sclaich


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

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

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


Viman   (2004-05-14 10:51:00) [16]

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


Digitman   (2004-05-14 10:47:00) [17]


> sclaich   (14.05.04 10:16) [3]


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

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


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

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


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

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


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

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

while true do
 TMyThread.Create(false)


:))


Страницы:   1 2

Наверх

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