![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Многопоточное приложение [D6, WinXP]
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)
:))