Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.07.2013, 14:52   #1
borderliner
Новичок
Джуниор
 
Регистрация: 13.07.2013
Сообщений: 5
Восклицание функция с потоками

Добрый день/вечер. Я все никак не могу разобраться с одним важным примером, если несложно подскажите как точно его решить.

В программе есть функция которая должна вычислить что-то по некой формуле. Это что-то может быть разбито на три параллельные, независимые части (циклы). В конце функция обрабатывает все три части/циклы и выдает нужный результат. Вот пример:

Код:
function vichislenie(a_,b_:string):real; 
{m и n константы (длинны строк a_ и b_), вобщем неважно}
var a:array[1..n] of integer; b:array[1..m] of integer; i:integer; d:array[1..n+m] of real; c:real;
begin
for i:=1 to n do a[i]:=strtoint(a_[i]);
for i:=1 to m do b[i]:=strtoint(b_[i]);
{ввод элементов массивов a и b, здесь неважно}

.......
 
{1}
for i:=1 to m do
d[i]:=a[i]*sqr(b[i]);
 
{2}
for i:=m+1 to n do
d[i]:=a[i]+b[i];
 
{3}
for i:=n+1 to n+m do
d[i]:=a[i]-b[i];

{формулы в моем случае намного сложнее, но не в этом суть}
 
{завершение}
c:=0;
for i:=1 to n+m do c:=c+d[i]*14523696*sin(i); Result:=c 
end;

Вычисления проходят успешно и ответ правельный, но....



Это очень длительный процесс (слишком большие массивы и многократные действия над ними) и разумеется пока все не закончиться форма будет "висеть". Это все грузит только одно ядро/нить так как процесс последовательный.



___________


Мне нужно чтобы три цикла прогонялись параллельно и выдали все элементы массива d (i от 1 до n+m) (я думаю я получу выигрыш по времени, задействую больше тредов и форма не будет висеть). Наверно надо как-то их вынести в отдельные процедуры-нити. В это время в главной программе результат должен "дождаться" окончания всех трех нитей, собрать с них все d-элементы и похимичив над ними выдать результат.



__________



Я не никогда не работал с тредами в дельфи, поэтому кто разбирается помогите в этом вопросе, мне срочно нужно разобраться в таких параллельных вычислениях. Если несложно разберите по косточкам данный пример (с коментариями) так как про треды я почти ничего не знаю. Мне всегда легче понять на знакомом мне примере, а поняв его и собравшись с мыслями я начну читать теорию.


Спасибо заранее.

Последний раз редактировалось borderliner; 13.07.2013 в 16:01.
borderliner вне форума Ответить с цитированием
Старый 13.07.2013, 15:20   #2
-glykaman-
Пользователь
 
Аватар для -glykaman-
 
Регистрация: 13.07.2013
Сообщений: 18
По умолчанию

Вот тут глянь урок по потокам в Delphi - http://programmerinfo.ru/thread/

Если что непонятно, пиши тут, помогу чем смогу =)
Я тебе чем-то помог? Нажми слева на значок весов. Спасибо =)
Мой сайт с видеоуроками по программированию - http://programmerinfo.ru/
-glykaman- вне форума Ответить с цитированием
Старый 13.07.2013, 15:54   #3
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию

Добавь строку в цыклы:
Код:
Application.ProcessMessages;
и не будет висеть.
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
саша40 вне форума Ответить с цитированием
Старый 13.07.2013, 16:05   #4
borderliner
Новичок
Джуниор
 
Регистрация: 13.07.2013
Сообщений: 5
По умолчанию

Цитата:
Сообщение от -glykaman- Посмотреть сообщение
Вот тут глянь урок по потокам в Delphi - http://programmerinfo.ru/thread/

Если что непонятно, пиши тут, помогу чем смогу =)
Спасибо за видео, посмотрю.


Цитата:
Сообщение от саша40 Посмотреть сообщение
Добавь строку в цыклы:
Код:
Application.ProcessMessages;
и не будет висеть.
Не знал о такой функции, спасибо.



Однако вопрос остается открытым, как в функции распределить циклы по потокам.
borderliner вне форума Ответить с цитированием
Старый 13.07.2013, 16:30   #5
-glykaman-
Пользователь
 
Аватар для -glykaman-
 
Регистрация: 13.07.2013
Сообщений: 18
По умолчанию

Цитата:
Сообщение от borderliner Посмотреть сообщение
Однако вопрос остается открытым, как в функции распределить циклы по потокам.
Ты сейчас просмотри, урок что я тебе дал, как раз там для этого пример есть. Глядишь может тему и закроешь сразу
Я тебе чем-то помог? Нажми слева на значок весов. Спасибо =)
Мой сайт с видеоуроками по программированию - http://programmerinfo.ru/
-glykaman- вне форума Ответить с цитированием
Старый 13.07.2013, 18:06   #6
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
там для этого пример есть.
Про параллельные и распределительные вычисления там ничего нет.
Человек_Борща вне форума Ответить с цитированием
Старый 13.07.2013, 21:35   #7
-glykaman-
Пользователь
 
Аватар для -glykaman-
 
Регистрация: 13.07.2013
Сообщений: 18
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Про параллельные и распределительные вычисления там ничего нет.
Ок смотри, создавай основной класс для работы потока как показано в видео, от него наследуй 3 класса наследника, у каждого из них создай собственную функцию(метод) в которой полностью записаны твои вычисления. теперь при запуске программы создавай эти потоки и запускай соответствующие методы с вычислениями. они будут выполняться одновременно.

ну а для отлавливания завершений работы потоков - можно вызывать исключение, но это долго, потому проще мне кажется добавить в потоки флаги говорящие о том закончена в них обработка или нет. и периодически просто опрашивать их по таймеру. можно еще через критическую секцию сделать или вообще тупо вызывать функцию специальную для конечных вычислений, на третий её вызов производить эти самые вычисления. в общем отловить результат не проблема если подумать.


надеюсь понятно объяснил? если нет придется полноценный урок писать на эту тему...
Просто для человека свободно владеющего ООП это само выливается из того примера что я дал в видео, ну во всяком случае если чуть чуть подумать ;-)
Я тебе чем-то помог? Нажми слева на значок весов. Спасибо =)
Мой сайт с видеоуроками по программированию - http://programmerinfo.ru/

Последний раз редактировалось -glykaman-; 13.07.2013 в 21:51.
-glykaman- вне форума Ответить с цитированием
Старый 13.07.2013, 22:16   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

У ТС задачка на распределительные и параллельные вычисления.
Формула режется на отдельные части и раздается потокам, а те, одновременно, решают и работают как один. Главное соблюдать целостность и порядок решения. Скорость, что важно для ТС, достигается этой самой многозадачностью.

Цитата:
в которой полностью записаны твои вычисления.
Ну не катит оно.

Цитата:
это само выливается из того примера что я дал в видео, ну во всяком случае если чуть чуть подумать
В вашем уроке вы показываете максимум мощь многозадачности, и каждый поток - самостоятелен и ему не обязательно знать, о чем думает его брат в момент Х, что как раз и нужно ТС.

Последний раз редактировалось Человек_Борща; 13.07.2013 в 22:18.
Человек_Борща вне форума Ответить с цитированием
Старый 13.07.2013, 22:20   #9
-glykaman-
Пользователь
 
Аватар для -glykaman-
 
Регистрация: 13.07.2013
Сообщений: 18
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Ну не катит оно.
Сорри я не въехал походу...

Но объясните мне тогда
Вот три части которые дал ТС:
Код:
{1}
for i:=1 to m do
d[i]:=a[i]*sqr(b[i]);
 
{2}
for i:=m+1 to n do
d[i]:=a[i]+b[i];
 
{3}
for i:=n+1 to n+m do
d[i]:=a[i]-b[i];
Каждую из них отдельный независимый поток запихать и все, разве не это требуется?
поучится что все они выполняются параллельно, разве нет?
Пример относительно простой вроде или я чего-то недогнал...
Я тебе чем-то помог? Нажми слева на значок весов. Спасибо =)
Мой сайт с видеоуроками по программированию - http://programmerinfo.ru/

Последний раз редактировалось -glykaman-; 13.07.2013 в 22:28.
-glykaman- вне форума Ответить с цитированием
Старый 13.07.2013, 22:26   #10
borderliner
Новичок
Джуниор
 
Регистрация: 13.07.2013
Сообщений: 5
По умолчанию

Потоки в Дельфи кажутся слишком запутанной и муторной процедурой, поэтому не увидев это на конкретном примере трудно увидеть аналогию, тем более для тех кто никогда с ними не работал. Прикольно что текст описывающий потоки и обращения к ним занимает гораздо больше места чем сам конкретный алгоритм. Я прочитал много всяких ссылок и везде все по-разному. Constructor, inherit, property, execute и тонна всяких других вещей которые я никогда не использовал в обычных однопоточных приложениях.
borderliner вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с потоками -Jack- Общие вопросы Delphi 3 12.02.2013 23:21
Работа с потоками derElektroBesen Помощь студентам 3 17.07.2011 14:33
работа с потоками SHtirlic1 Общие вопросы Delphi 10 15.03.2011 20:03
Проблемы с потоками в С m9yt Общие вопросы C/C++ 4 14.04.2010 14:25
Работа с потоками Яр|/||< (^_^) Общие вопросы Delphi 5 09.03.2010 08:23