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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.12.2014, 01:09   #1
hapera2
Пользователь
 
Регистрация: 12.11.2013
Сообщений: 65
По умолчанию Ускорение выполнения задачи с помощью потоков.

К примеру есть числа:
1
2
3
4
5
6
7
8
9
10

Моя программа прибавляет к первому 1, потом выводит результат в мемо, потом ко второму прибавляет 1, выводит результат в мемо и так до 10.
В результате мы получаем:
2
3
4
5
6
7
8
9
10
11


Теперь вопрос: мне надо ускорить этот процесс с помощью потоков.
Если просто скопировать код в тело потока и запустить их штук 10,
то мы получим не ускоренную работу а повторение каждого из результата по десять раз.
Как сделать так что бы поток понимал что этим числом уже занимается другой поток и без особых потерь переходил к другому числу?

Не спрашивайте зачем.
hapera2 вне форума Ответить с цитированием
Старый 17.12.2014, 09:49   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

"разбить" список на НЕпересекающиеся участки и каждому потоку НАЗНАЧИТЬ(задать) свой участок.
И помнить что поток НЕ ДОЛЖЕН напрямую работать с VCL(формы, контролы (тот же Memo)).
По крайней мере использовать synchonize при этом (form, Memo внутри потока).
или так
http://programmersforum.ru/showthrea...hlight=TThread
и потоки и мемо.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 17.12.2014 в 09:55.
evg_m вне форума Ответить с цитированием
Старый 17.12.2014, 09:49   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Цитата:
Как сделать так что бы поток понимал что этим числом уже занимается другой поток и без особых потерь переходил к другому числу?
разделить кол-во данных на кол-во потоков, полученное ко-во данных передать каждому потоку, остаток от деления отдать последнему потоку(либо повторить деление, если возможно).
Человек_Борща вне форума Ответить с цитированием
Старый 17.12.2014, 09:59   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Моя программа прибавляет к первому 1, потом выводит результат в мемо, потом ко второму прибавляет 1, выводит результат в мемо и так до 10
Скорее всего потоки просто замедлят решение задачи в такой постановке - слишком частое обращение к VCL
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 17.12.2014, 12:53   #5
hapera2
Пользователь
 
Регистрация: 12.11.2013
Сообщений: 65
По умолчанию

Потоки мои создаются динамично и все было бы классно, если бы каждый поток знал какой он номер. Но он не знает.
hapera2 вне форума Ответить с цитированием
Старый 17.12.2014, 13:01   #6
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Цитата:
Потоки мои создаются динамично и все было бы классно, если бы каждый поток знал какой он номер. Но он не знает.
Читать моё сообщение до полного понимания. Потоки и не будут знать, пока не напишешь им раздатчик.
Человек_Борща вне форума Ответить с цитированием
Старый 17.12.2014, 13:08   #7
hapera2
Пользователь
 
Регистрация: 12.11.2013
Сообщений: 65
По умолчанию

Я тебя прекрасно понял. Разделил данные на количество потоков, теперь хорошо бы что бы каждый поток знал к какому кусочку ему подключаться. Как сделать раздатчик? Потоки динамические.
hapera2 вне форума Ответить с цитированием
Старый 17.12.2014, 13:12   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Цитата:
теперь хорошо бы что бы каждый поток знал к какому кусочку ему подключаться
Тупо передавай кусочек в сам поток и не беспокойся.
Человек_Борща вне форума Ответить с цитированием
Старый 17.12.2014, 13:16   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Цитата:
Как сделать раздатчик? Потоки динамические.
Указывать назначенные номера при создании. Для этого написать свой конструктор потока и/или использовать свои (опять же) свойства (property) /методы (procedure) определенные в классе СВОЕГО потока.

Код:
r:=TMyThread.Create(...., firtsnum, lastnum);
Код:
r:=TMyTread.Create;
r.first:=1;
r.last:=10;
r.Resume;
или читать по ссылке пост 2
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 17.12.2014, 15:51   #10
hapera2
Пользователь
 
Регистрация: 12.11.2013
Сообщений: 65
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Для этого написать свой конструктор потока и/или использовать свои (опять же) свойства (property) /методы (procedure) определенные в классе СВОЕГО потока.
hapera2 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оптимизация вычислений с помощью потоков. skazochnik Помощь студентам 10 06.10.2014 21:13
Многократное использование потоков(пул потоков) ProgrammistRT Общие вопросы Delphi 10 06.04.2014 13:42
Решение задачи в Pascal ABC с помощью функции. Krakaziabr Паскаль, Turbo Pascal, PascalABC.NET 0 22.12.2013 16:12
Ускорение выполнения запроса MySQL Gulik БД в Delphi 8 05.09.2011 22:16
Разделить время выполнения потоков MrBrain Общие вопросы .NET 0 22.06.2010 18:13