Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
0 / 0 / 0
Регистрация: 21.01.2014
Сообщений: 18

Распараллеливание через потоки

22.10.2018, 17:26. Показов 3995. Ответов 21

Студворк — интернет-сервис помощи студентам
Всем привет.

Ребята!
У меня есть цикл for от 1 до 500 000 и он выполняется за 1 секунду (каждые 10 000 шагов я перерисовываю TLabel). Я создал два потока и у каждого свой цикл. У первого от 0 до 500 000, а у второго от 500 001 до 1 000 000. Внутри этих потоков я также каждые 10 000 шагов вызываю перерисов TLаbel'ов.

То есть я хотел получить больше процессорного времени и ускорить вычисления, а в результате потоки отрабатывают за 5 секунд т.е. (500 000 + 500 000)/5=200 000

200 000 против 500 000

Подскажите, пожалуйста, что не так и возможно ли в принципе ускорить перебор ? Сам алгоритм в цикле прошу ен рассматривать.

Спасибо


Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
TMyThread = class(TThread)
    x,y,d: Cardinal;
    PAINT:boolean;
    LBL:TLabel;
    procedure Execute; override;
    procedure Drawer;
  end;
 
var  MyThread1,MyThread2: TMyThread;
 
procedure TMyThread.Execute;
var S,C,j,k,i:Cardinal;
    A:AnsiString;
begin
for i:=x to y do
  begin
    ты-ты-ты-ры
    end;
   d:=i;
   if (d mod 10000 =0) then
    Synchronize(Drawer);
  end;
 T2:=Now;
 
end;
 
procedure TMyThread.Drawer;
begin
 Form1.Label1.Caption:=IntToStr(MyThread1.d);
 Form1.Label2.Caption:=IntToStr(MyThread2.d);
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var S,C,j,k:Cardinal;
    A:AnsiString;
 
begin
 T1:=Now;
 
 MyThread1:=TMyThread.Create(true);
 MyThread1.x:=10;
 MyThread1.y:=500000;
 MyThread1.d:=0;
 MyThread1.LBL:=Label1;
 
 MyThread2:=TMyThread.Create(true);
 MyThread2.x:=500001;
 MyThread2.y:=1000000;
 MyThread2.d:=0;
 MyThread2.LBL:=Label2;
 
 MyThread1.Resume;
 MyThread2.Resume;
 
end;
 
 
procedure TForm1.Button2Click(Sender: TObject);
begin
   ShowMessage(IntToStr(SecondsBetween(T1,T2)));
end;
 
end.
Добавлено через 5 минут
Забыл добавить, что вызывает перерисов у меня ТОЛЬКО 1 поток. Я поставил условие. Если свойство класса (потока) такое - то то вызов синхронизации, иначе ничего.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.10.2018, 17:26
Ответы с готовыми решениями:

Матрица через потоки
Помогите, пожалуйста, если не сложно. Буду очень благодарна. Задание:Нужно вывести в StringGrid матрицу размером MxN (размер берется из...

Добавление контактов в SkypeAPI через потоки
Здравствуйте! Вообщем возник такой вопрос, как добавить контакты в ListBox1 из скайпа используя SkypeAPI быстро через потоки. У меня 1400...

Распараллеливание. Потоки.
Есть функция: private void ExecuteProgram(string filename) { blablabla } Есть событие, по которому...

21
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,686
Записей в блоге: 21
24.10.2018, 14:36
Лучший ответ Сообщение было отмечено Скат как решение

Решение

Студворк — интернет-сервис помощи студентам
я несколько изменил пример
он теперь почище.

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

соответственно, из примера я убрал работы со строками
Вложения
Тип файла: 7z mod.7z (1.9 Кб, 6 просмотров)
1
0 / 0 / 0
Регистрация: 21.01.2014
Сообщений: 18
25.10.2018, 11:48  [ТС]
по кнопке делаю
запускается эта же программа с параметрами (от и до)

Delphi
1
 ShellExecute(Handle, 'open', 'D:\Project1.exe', PChar(Edit1.Text+' '+Edit2.Text), nil, SW_SHOWNORMAL);
в ней в таймере через 2 сек после показа формы (может не обязательно)
Delphi
1
2
3
4
5
6
7
8
9
10
if ParamCount<>0 then
  begin
   Timer1.Enabled:=false;
   Edit1.Text:=ParamStr(1);
   Edit2.Text:=ParamStr(2);
 
   T1:=Now;
   for i:=StrToInt(ParamStr(1)) to StrToInt(ParamStr(2)) do
    begin
     делаем дело
Короче говоря добился. Наблюдаю ускорение. Теперь запустим 20 самих себя и посмотрим что будет))

Ваш код посомтрю. Огромное спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.10.2018, 11:48

Распараллеливание через omp.h
// labaOMP.cpp: определяет точку входа для консольного приложения. // #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include...

DDos через потоки
вот код: unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,...

Будильник через потоки
Как можно написать будильник чтобы он работал через потоки. Пользователь вводит время и после того как программа сравнивает системное время...

Вычисление функции через потоки
Добрый вечер, есть функция: A = (B*MX)(MO(MT*MK)) И номера потоков, в которых задаются значения векторов и матриц ...

Запись в файл через потоки
fstream file; ... cout&lt;&lt;&quot;Введите - имя файла.dat:&quot;&lt;&lt;endl; cin&gt;&gt;fname; file.open(fname,...


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

Или воспользуйтесь поиском по форуму:
22
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru