Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Tot999
14 / 14 / 14
Регистрация: 10.06.2015
Сообщений: 162
#1

Где создавать потоки для выполнения метода класса? - Delphi

17.02.2017, 07:47. Просмотров 180. Ответов 4
Метки нет (Все метки)

Доброго времени суток! Не совсем владею материалом, (вернее, совсем не) поэтому могу написать ахинею. Тем не менее:
У меня есть класс Tpriemnik

Delphi
1
2
3
4
5
TPriemnik = class
...
Procedure CountStatistic(x : int64);
Procedure Countall;
...
Метод Countall, содержит обращение к методу CountStatistic
Delphi
1
2
3
4
5
6
Procedure Tpriemnik.CountStatistic;
...
for n:= 1 to 5000000 do
    CountStatistic(n);
...
end;
(Всё немного сложнее страниц на 15 кода, но общая суть сводится к вышеописанному)
Выполнение расчётов затягивается на несколько минут, поэтому появилась идея разбить выполнение на потоки и здесь возник вопрос. Как это правильно сделать?
Необходимо создать массив потоков внутри класса Tpriemnik или же вынести расчёты метода отдельно за класс в отдельную процедуру?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.02.2017, 07:47
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Где создавать потоки для выполнения метода класса? (Delphi):

Можно ли во время выполнения программы создавать и удалять страницы класса TTabSheet компоненты TPageControl?
Можно ли во время выполнения программы создавать и удалять страницы класса...

Как обратиться к свойству класса из метода этого же класса
Добрый день! function Tta_component.check: boolean; //âåðíåò true åñëè ïðè...

Вызов метода класса методом другого класса
Есть 2 класса: UControl с классом TControl и UEditor с классом TEditor. Метод...

Создание метода класса
Написал программу, теперь надо засунуть все, что находится в procedure...

Создание метода класса Init
Здравствуйте! Помогите, пожалуйста, разобрать, почему компилятор может выдавать...

Запуск метода класса через кнопку
Ужасно стыдно, но я имею очень небольшое представление о работе классов. Да и...

4
avstantso
71 / 71 / 43
Регистрация: 17.11.2016
Сообщений: 211
17.02.2017, 12:43 #2
Цитата Сообщение от Tot999 Посмотреть сообщение
Выполнение расчётов затягивается на несколько минут, поэтому появилась идея разбить выполнение на потоки
Здесь четко и по делу: http://www.cyberforum.ru/delphi-begi...ml#post9999550

Цитата Сообщение от Tot999 Посмотреть сообщение
Как это правильно сделать?
Для начала — проанализировать свою задачу в рамках многопоточного подхода:
1. Откуда берутся входные данные для расчета?
2. Куда передаются выходные данные расчета?
3. Какие общие ресурсы (переменные, объекты, компоненты) используются при расчете?

Будет здорово, если ты напишешь об этом. Тогда можно будет говорить об этом:
Цитата Сообщение от Tot999 Посмотреть сообщение
Необходимо создать массив потоков внутри класса Tpriemnik или же вынести расчёты метода отдельно за класс в отдельную процедуру?

P.S.
Кликните здесь для просмотра всего текста

Цитата Сообщение от Tot999 Посмотреть сообщение
Метод Countall, содержит обращение к методу CountStatistic
Procedure Tpriemnik.CountStatistic;
...
for n:= 1 to 5000000 do
* * CountStatistic(n);
...
end;
Это такая хитрая рекурсия? Или имелось в виду:

Delphi
1
2
3
4
5
6
Procedure Tpriemnik.Countall;
...
for n:= 1 to 5000000 do
* * CountStatistic(n);
...
end;
0
Tot999
14 / 14 / 14
Регистрация: 10.06.2015
Сообщений: 162
22.02.2017, 01:44  [ТС] #3
avstantso, нет, там не рекурсия, там все в лоб пачка методов.
В общем, немного переделал пару процедур, сделал массив потоков, мерность массива просто для собственного удобства.
Там какая-то ошибка была насчёт нехватки памяти, воткнул слип и зациклил. В итоге получил ускорения в расчётах где-то в 4 раза, проц всегда загружен на 60-80%, память на 5гб из 8гб. Может, если с приоритетами - это что-нибудь даст.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
          
                     start:
                            try
                             errflag:= false;
                             MyThreads[o,p,a,b]:=MyThread.Create(True);
                             MyThreads[o,p,a,b].a:=o;
                             MyThreads[o,p,a,b].b:=p;
                             MyThreads[o,p,a,b].c:=a;
                             MyThreads[o,p,a,b].d:=b;
                             MyThreads[o,p,a,b].Resume;
                            except
                              sleep(50);
                              errflag:= false;
                              inc(kolvooshiboksozdpotoka);
                            end;
                      if errflag then goto start;
0
northener
22.02.2017, 02:52
  #4

Не по теме:

Цитата Сообщение от Tot999 Посмотреть сообщение
воткнул слип и зациклил
Ещё одно добавление в те 90% говна, о которых давно уже сказал Gunsmoker.

0
Пытливый
1379 / 690 / 249
Регистрация: 29.05.2013
Сообщений: 3,086
23.02.2017, 10:19 #5
Sleep не в основной поток, а в пользовательский надо перенести, тогда разгрузите проц, но замедлите расчеты немножко.
Если это не разовая задача, то настоятельно рекомендую почитать об использовании графического процессора для расчетов - там выигрыш по времени пойдет уже не в разы а на порядок, а для доступа к этим возможностям можно использовать библиотечку OpenCL.
1
23.02.2017, 10:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.02.2017, 10:19
Привет! Вот еще темы с решениями:

Реализация метода класса в другом модуле
Имеется Unit1 с формой Form1 типа TForm1. У типа TForm1 описан метод procedure...

Получить адрес метода в классе через экземпляр класса
Здравствуйте знатоки! Прошу помощи. Переношу один проэкт с скриптового языка...

Реализация метода вращений Якоби (где-то ошибся)
Всем здравствуйте и с Новым Годом :) Переписывал из Pascal в Delphi и где-то...

CreateThread перестаёт создавать потоки (видимо утечка ресурсов, но вот где?)
Собственно есть программа которая занимается расчётами. Создаёт по 8 потоков...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru