Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос про потоки TThread [D5, D6, Win95/98, WinME, NT4, Win2k, WinXP]


Страницы:   1 2

Eugene ©   (2002-08-29 08:30:00) 

Здравствуйте.
Есть необходимость создать динамически несколько потоков (1-10)
При этом каждый потом выполняет одну и тужу процедуру, только с чуть разными параметрами. Вопрос: как мне их сихронизировать, а то все очень тормозит. До этого создовался одтн поток, все работало, но мою задачу можно выполнять разбив её на несколько частей, для этого я решил использовать для каждый части свой поток. Скажите, правильно ли это.
Спасибо.


Eugene   (2002-08-30 17:42:00) [1]

Значит никто исходники не смотрел, жаль.


Eugene   (2002-08-29 23:33:00) [2]

> max2057
Смотри выше, я написалчто использовал компонент TagThread из коллекции компонентов Alex Ghost Library http://aghost.da.ru
Это обычный наследник TThread с дополнительными функциями.


max2057   (2002-08-29 17:22:00) [3]

А че это за модный TTHread - откуда у него методы OnExecute,
OnStart?


Набережных С.   (2002-08-29 16:48:00) [4]


> Alx2 © (29.08.02 10:17)
> >Eugene © (29.08.02 10:06)
> На однопроцессорной машине такой подход очень сильно замедлит
> выполнение.

Разница очень незначительная, в пределах погрешности измерений - при условии, что задача достаточно длительная.


Eugene   (2002-08-29 14:17:00) [5]

Да, если не будет качаться, то замените раширение на bmp


Eugene   (2002-08-29 10:45:00) [6]

> kronprince
А никак нельзя синхронизировать ?

> Alx2
Это рассчитано на серваки (от 2 и более процов)

> To All
Я выложил архивчик с исходниками 30кб в архиве, пароль TThread
Посмотрите, может что и посоветуете.
http://proga.fromru.com/Main.exe


Alx2   (2002-08-29 10:17:00) [7]

>Eugene © (29.08.02 10:06)
На однопроцессорной машине такой подход очень сильно замедлит выполнение.


kronprince   (2002-08-29 10:09:00) [8]

- ну извини мужик :)
- если нужно 10(десять) потоков и Execute максимально оптимизирован - то единственный выход - идти заваривать кофе и ЖДАТЬ
- хотя - если можно - разбить "Главная процедура с большими вычислениями" на более мелкие части - в этом случае есть вероятность исполнения критического по времени кода в разное время


MBo   (2002-08-29 10:07:00) [9]

>каждый символ из 10 можно вычислять отдельно. Вот для этого и нужны потоки
Не помогут.


Eugene   (2002-08-29 10:06:00) [10]

> Alx2 © (29.08.02 09:57)
Есть алгоритм, который генерит уникальные комбинации паролей из заданного набора символов. Работа идет большая, при заданных 10 исходный сомволах и ширине пароля в 6 символов количество результатов = (1^6 + 2^6 +...+10^6). Число перебора очень большое, при этом каждый символ из 10 можно вычислять отдельно. Вот для этого и нужны потоки.
Я могу выложить исходники если это поможет решить мою проблему.


Alx2   (2002-08-29 09:57:00) [11]

>Eugene © (29.08.02 09:47)
С какой именно целью задача рапределяетмя между десятью исполнителями?


Eugene   (2002-08-29 09:47:00) [12]

> ЮЮ © (29.08.02 09:43)
> Написать алгоритм, работающий в 10 раз быстрее

Нельзя, алгоритм максимально оптимизорован.


ЮЮ   (2002-08-29 09:43:00) [13]

Написать алгоритм, работающий в 10 раз быстрее


Eugene   (2002-08-29 09:39:00) [14]

> Polevi
TagThread - это и есть наследник TThread

> To All
Так как же грамотно решить мою задачу ?
10 потоков - плохо.
10 программ - тоже плохо.
Как быть ???


Polevi   (2002-08-29 09:26:00) [15]

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;





ЮЮ   (2002-08-29 09:24:00) [16]

> Polevi ©
А автор ны 10 прцессорах мучается ? :-)
> Eugene ©
10 программ точно также не сделают работу в 10 раз быстрей, только если на 10 разных компьютерах.


Polevi   (2002-08-29 09:20:00) [17]

2ЮЮ ©
это если процессор один


Eugene   (2002-08-29 09:19:00) [18]

> ЮЮ
Тогда как же мне сделать разбиение ?
Ну не запускать же мне 10 программ одновременно, что бы они выполняли каждый свой кусок.


ЮЮ   (2002-08-29 09:16:00) [19]

"Главная процедура с большими вычислениями" в 10 потоках не будет работать в 10 раз быстрее, но медленнее, чем в одном :-)


Eugene   (2002-08-29 09:00:00) [20]

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;



Страницы:   1 2

Наверх

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