Форум: "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.56 MB
Время: 0.032 c