Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.09.12;
Скачать: CL | DM;

Вниз

Вопрос про потоки 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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.022 c
3-35557
SR
2002-08-21 06:52
2002.09.12
Защита базы или архивация


4-35945
eruc
2002-07-21 18:36
2002.09.12
Drag & Drop ??? what ???


1-35661
jcrush
2002-09-02 10:19
2002.09.12
курсор в RichEdit, нажимаю Enter Мастера! DELPHI откликнитесь


1-35793
Егор
2002-08-27 18:19
2002.09.12
Сложение.


6-35846
verman_sasa
2002-07-03 13:26
2002.09.12
Login в домен