Форум: "Основная";
Текущий архив: 2002.09.12;
Скачать: [xml.tar.bz2];
ВнизВопрос про потоки TThread Найти похожие ветки
← →
Eugene (2002-08-29 08:30) [0]Здравствуйте.
Есть необходимость создать динамически несколько потоков (1-10)
При этом каждый потом выполняет одну и тужу процедуру, только с чуть разными параметрами. Вопрос: как мне их сихронизировать, а то все очень тормозит. До этого создовался одтн поток, все работало, но мою задачу можно выполнять разбив её на несколько частей, для этого я решил использовать для каждый части свой поток. Скажите, правильно ли это.
Спасибо.
← →
MBo (2002-08-29 08:36) [1]В принципе, наверно, правильно все зависит от правильной реализации. Конкретного вопроса пока нет?
← →
Anatoly Podgoretsky (2002-08-29 08:57) [2]Но твою задачу можно решить без разбиения на потоки, правильно ли это. Сравнив эти два высказывания ты сможешь выбрать какое правильно для тебя.
Хинт вариант с 10 потоками требует больше времени.
← →
Eugene (2002-08-29 09:00) [3]Tagthread - компонент из известной библиотеки
Alex Ghost Library http://aghost.da.ru
Вот пример кода, посмотрите правильно ли я сделал ?
Var
MyThread : Array of TagThread;
Thread_Count : Integer = 0;
procedure TFormMain.Button3Click(Sender: TObject);
begin
SetLength(MyThread,5);
for i:=0 to high(MyThread) do MyThread[i]:=nil;
for i:=1 to high(MyThread) do Thread_Create(i);
for i:=1 to high(MyThread) do MyThread[i].execute
end
procedure TFormMain.Thread_Create(Const ID: Integer);
Begin
try
inc(Thread_Count);
MyThread[ID]:=TagThread.Create(self);
except
Dec(Thread_Count);
MyThread[ID]:=nil;
end;
with MyThread[ID] do
Begin
Name:="MyThread"+FssIntToStr(ID);
Cycled:=False;
Interval:=0;
Priority:=tpNormal;
Suspended:=True;
Tag:=ID;
OnExecute:=Thread_OnStart;
OnTerminate:=Thread_OnStop;
OnException:=Thread_OnException;
end;
end;
procedure TFormMain.Thread_OnStart(Sender: TObject);
Begin
// Главная процедура с большими вычислениями
end;
procedure TFormMain.Thread_OnStop(Sender: TObject);
var
i : integer;
Begin
Dec(Thread_Count);
if (Thread_Count = 0) then
Begin
for i:=1 to high(MyThread) do
Begin
MyThread[i].Destroy;
MyThread[i]:=nil;
end;
end;
end;
← →
ЮЮ (2002-08-29 09:16) [4]"Главная процедура с большими вычислениями" в 10 потоках не будет работать в 10 раз быстрее, но медленнее, чем в одном :-)
← →
Eugene (2002-08-29 09:19) [5]> ЮЮ
Тогда как же мне сделать разбиение ?
Ну не запускать же мне 10 программ одновременно, что бы они выполняли каждый свой кусок.
← →
Polevi (2002-08-29 09:20) [6]2ЮЮ ©
это если процессор один
← →
ЮЮ (2002-08-29 09:24) [7]> Polevi ©
А автор ны 10 прцессорах мучается ? :-)
> Eugene ©
10 программ точно также не сделают работу в 10 раз быстрей, только если на 10 разных компьютерах.
← →
Polevi (2002-08-29 09:26) [8]2Eugene ©
я не знаком с TagThread но твой код както мне не нравится :-)
я на твоем месте все описал своего наследника от TThread
type
TZThread=class(TTHread)
public
constructor Create(...);reintroduce;
procedure Execute;override;
end;
constructor TZThread.Create(...);
begin
inherited(true);
..
..
Resume;
end;
procedure TZThread.Execute;
begin
..
..
end;
← →
Eugene (2002-08-29 09:39) [9]> Polevi
TagThread - это и есть наследник TThread
> To All
Так как же грамотно решить мою задачу ?
10 потоков - плохо.
10 программ - тоже плохо.
Как быть ???
← →
ЮЮ (2002-08-29 09:43) [10]Написать алгоритм, работающий в 10 раз быстрее
← →
Eugene (2002-08-29 09:47) [11]> ЮЮ © (29.08.02 09:43)
> Написать алгоритм, работающий в 10 раз быстрее
Нельзя, алгоритм максимально оптимизорован.
← →
Alx2 (2002-08-29 09:57) [12]>Eugene © (29.08.02 09:47)
С какой именно целью задача рапределяетмя между десятью исполнителями?
← →
Eugene (2002-08-29 10:06) [13]> Alx2 © (29.08.02 09:57)
Есть алгоритм, который генерит уникальные комбинации паролей из заданного набора символов. Работа идет большая, при заданных 10 исходный сомволах и ширине пароля в 6 символов количество результатов = (1^6 + 2^6 +...+10^6). Число перебора очень большое, при этом каждый символ из 10 можно вычислять отдельно. Вот для этого и нужны потоки.
Я могу выложить исходники если это поможет решить мою проблему.
← →
MBo (2002-08-29 10:07) [14]>каждый символ из 10 можно вычислять отдельно. Вот для этого и нужны потоки
Не помогут.
← →
kronprince (2002-08-29 10:09) [15]- ну извини мужик :)
- если нужно 10(десять) потоков и Execute максимально оптимизирован - то единственный выход - идти заваривать кофе и ЖДАТЬ
- хотя - если можно - разбить "Главная процедура с большими вычислениями" на более мелкие части - в этом случае есть вероятность исполнения критического по времени кода в разное время
← →
Alx2 (2002-08-29 10:17) [16]>Eugene © (29.08.02 10:06)
На однопроцессорной машине такой подход очень сильно замедлит выполнение.
← →
Eugene (2002-08-29 10:45) [17]> kronprince
А никак нельзя синхронизировать ?
> Alx2
Это рассчитано на серваки (от 2 и более процов)
> To All
Я выложил архивчик с исходниками 30кб в архиве, пароль TThread
Посмотрите, может что и посоветуете.
http://proga.fromru.com/Main.exe
← →
Eugene (2002-08-29 14:17) [18]Да, если не будет качаться, то замените раширение на bmp
← →
Набережных С. (2002-08-29 16:48) [19]
> Alx2 © (29.08.02 10:17)
> >Eugene © (29.08.02 10:06)
> На однопроцессорной машине такой подход очень сильно замедлит
> выполнение.
Разница очень незначительная, в пределах погрешности измерений - при условии, что задача достаточно длительная.
← →
max2057 (2002-08-29 17:22) [20]А че это за модный TTHread - откуда у него методы OnExecute,
OnStart?
← →
Eugene (2002-08-29 23:33) [21]> max2057
Смотри выше, я написалчто использовал компонент TagThread из коллекции компонентов Alex Ghost Library http://aghost.da.ru
Это обычный наследник TThread с дополнительными функциями.
← →
Eugene (2002-08-30 17:42) [22]Значит никто исходники не смотрел, жаль.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.09.12;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.008 c