Форум программистов, компьютерный форум, киберфорум
Наши страницы

Delphi для начинающих

Войти
Регистрация
Восстановить пароль
 
Tot999
13 / 13 / 5
Регистрация: 10.06.2015
Сообщений: 161
#1

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

17.02.2017, 07:47. Просмотров 165. Ответов 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? - Delphi
Можно ли во время выполнения программы создавать и удалять страницы класса TTabSheet компоненты TPageControl?

Как обратиться к свойству класса из метода этого же класса - Delphi
Добрый день! function Tta_component.check: boolean; //âåðíåò true åñëè ïðè èíèöèàëèçàöèè áûëà äîïóùåíà îøèáêà var temp_result:...

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

Создание метода класса - Delphi
Написал программу, теперь надо засунуть все, что находится в procedure TForm1.Button3Click(Sender: TObject); в Метод класса. Как это...

Создание метода класса Init - Delphi
Здравствуйте! Помогите, пожалуйста, разобрать, почему компилятор может выдавать такую ошибку: Project Project1.exe raised exception...

Реализация метода класса в другом модуле - Delphi
Имеется Unit1 с формой Form1 типа TForm1. У типа TForm1 описан метод procedure abc(). Как реализовать этот метод в другом модуле?

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

Цитата Сообщение от 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
13 / 13 / 5
Регистрация: 10.06.2015
Сообщений: 161
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
Пытливый
1313 / 629 / 148
Регистрация: 29.05.2013
Сообщений: 2,720
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
Привет! Вот еще темы с ответами:

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

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

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

CreateThread перестаёт создавать потоки (видимо утечка ресурсов, но вот где?) - C++ WinAPI
Собственно есть программа которая занимается расчётами. Создаёт по 8 потоков для каждой итерации расчётов (итерация завершается тогда,...


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

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

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