Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-35906
Владимир Шевченко
2002-08-16 14:53
2002.09.12
Form1.Query Format


1-35753
Mr. Faga
2002-08-30 16:53
2002.09.12
Delphi 7


1-35648
jcrush
2002-09-01 18:41
2002.09.12
FindFirst((ExtractFilePath(Application.... МАСТЕРА! помогите с ра


14-35884
Вадим
2002-08-16 14:46
2002.09.12
Как реализовать?


1-35700
A7exander
2002-08-29 16:01
2002.09.12
Виснет Дельфя





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский