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

Можно ли и как запустить в программе, написанной на Delphi 7, 12 разных циклов одновременно?

03.08.2017, 13:10. Показов 3032. Ответов 57
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Профи подскажите, можно ли и как запустить в программе написанной на Delphi 7 12 разных циклов одновременно, и чтобы получать из них результаты и собрать эти результаты в один?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.08.2017, 13:10
Ответы с готовыми решениями:

Как запустить метод класса одновременно в разных потоках?
Как запустить метод класса одновременно в разных потоках? Будет ли конфликт между ними, или создать несколько экз. класса и в каждом потоке...

Права администратора в программе написанной на delphi xe3
Здравствуйте, программисты! Столкнулся с такой проблемой. Добавление собственного манифеста в программу. Раньше, когда добавлял...

Можно ли создать тест в программе My Test Student и запустить этот тест через Delphi?
Здравствуйте! Мне нужна помощь! Я сейчас делаю курсовую, и мне нужно сделать тест, и я хотела бы узнать можно создать тест в программе My...

57
пофигист широкого профиля
4770 / 3206 / 862
Регистрация: 15.07.2013
Сообщений: 18,613
06.08.2017, 02:25
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от qwertehok Посмотреть сообщение
Не по теме:
Цитата Сообщение от Пытливый Посмотреть сообщение
Они работают одновременно
на 20ти ядерном процессоре?
Да "одновременно". Даже на одноядерном процессоре.
Извини за эту придирку, но вопрос ТС как раз это подразумевает, имхо.
0
1 / 0 / 0
Регистрация: 03.08.2017
Сообщений: 37
06.08.2017, 09:22  [ТС]
Скажите, можно ли какой-то получить номера потоков по возрастанию? К примеру, при запуске потоков, получать их id или номер в виде 1,2,3,4. Можно как-то так?
0
 Аватар для Пытливый
3764 / 2272 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
06.08.2017, 09:32
У меня в примере такой номер получается при добавлении новой строки в мемо, но мне он там нужен только для связывания потока с его отображаемой строкой в мемо. А вам для чего?
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,684
Записей в блоге: 21
06.08.2017, 09:41
да кто же кроме вас будет им номера-то давать???
и в чем проблема добавить в класс 100500 нужных вам полей и методов

Delphi
1
2
3
4
5
6
7
8
9
TMyThread=class(TThread)
  ID:integer;
end;
 
for i:=0 to 99 do
begin
  th:=TMyThread.Create(TRUE);
  th.ID:=i;
end;
1
1 / 0 / 0
Регистрация: 03.08.2017
Сообщений: 37
06.08.2017, 10:24  [ТС]
запускаю 2 потока так:
Delphi
1
2
3
4
5
6
7
8
 MThread:= TmThread.Create;
 MThread.PotokID1 := 1;
 MThread.Priority := tpLowest;
 MThread.Resume;
  MThread:= TmThread.Create;
  MThread.PotokID2 := 1;
  MThread.Priority := tpLowest;
  MThread.Resume;
Но после запуска второго потока PotokID1 стаёт нулём. В чём проблема то? Что-то делаю не так походу)

Добавлено через 6 минут
Написал так:
Delphi
1
2
3
4
5
6
7
for ti:=1 to 2 do
begin
  MThread := TmThread.Create;
  MThread.PotokID := ti;
  MThread.Priority := tpLowest;
  MThread.Resume;
end;
А в execute потока проверять PotokID и выполнять разный цикл для PotokID 1 и 2. Но для PotokID := 1 стоит while true do ,после запуска кода для PotokID := 2 первый почему-то не хочет работать.

Добавлено через 9 минут
Сам цикл работает, но в первом потоке стоит проверка для
Delphi
1
if (Length(code) > 0)
выполняем код, а во втором потоке переменной code присваиваются значения, переменную code объявил для общего потока, но в первом потоке она почему-то пустая всёвремя.
0
Айлурофил
 Аватар для Massaraksh7
518 / 451 / 112
Регистрация: 27.05.2017
Сообщений: 2,749
Записей в блоге: 7
06.08.2017, 10:24
Вот тебе ещё пример. Здесь потоки сразу пронумерованы.
Программа находит сумму чисел от 1 до 11000. При этом разбивает вычисления на 11 потоков, с тем, чтобы каждый обрабатывал свою часть, а потом складывает все результаты.
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
64
65
66
67
68
69
70
71
72
73
unit UThr;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type TMyThread=class(TThread)
   private
     { Private declarations }
   protected
   procedure Execute; override;
   public
   startvalue:integer;  // начальное значение суммирования
   stopvalue:integer;   // конечное значение суммирования
   sum:integer;         // сумма-результат потока
   end;
 
 
type
  TForm16 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  Th:array [0..10] of TMyThread; // 11 потоков
  xsum:integer;                  // Общая сумма всех потоков
  end;
 
var
  Form16: TForm16;
 
implementation
 
{$R *.dfm}
 
procedure TMyThread.Execute;
var i:integer;
begin
sum:=0; // сумма потока
for i:=startvalue to stopvalue do sum:=sum+i; // Поток работает и считает от своего начального значения до конечного
Form16.xsum:=Form16.xsum+sum; // Добавляет в общую сумму
Terminate; // Завершение потока
end;
 
procedure TForm16.Button1Click(Sender: TObject);
var i,k:integer;
begin
for i:=0 to 10 do
   begin
   Th[i]:=TMyThread.Create(True);   // Создание 11 потоков
   Th[i].FreeOnTerminate:=True;
   Th[i].startvalue:=i*1000;        // Распределение начальной и конечной
   Th[i].stopvalue:=i*1000+1000-1;  // сумм по потокам
   end;
xsum:=0; // Общая сумма=0
for i:=0 to 10 do Th[i].Start; // Запуск 11 потоков
 
// Проверка, чтобы все потоки завершились
repeat
   begin
   k:=0;
   for i:=0 to 10 do if Th[i].Terminated=True then inc(k);
   end;
until (k=11);
///------Потоки завершились
Button1.Caption:=IntToStr(xsum);
end;
 
end.
1
1 / 0 / 0
Регистрация: 03.08.2017
Сообщений: 37
06.08.2017, 10:29  [ТС]
Сори, всё работает, мой косяк) Всем спасибо за помощь) плохо спал, видимо из-за этого сразу не обратил внимание на одну мелкую ошибочку
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
06.08.2017, 10:32
Цитата Сообщение от Massaraksh7 Посмотреть сообщение
Form16.xsum:=Form16.xsum+sum; // Добавляет в общую сумму
жестяк № 1

Цитата Сообщение от Massaraksh7 Посмотреть сообщение
Terminate; // Завершение потока
жестяк № 2

Цитата Сообщение от Massaraksh7 Посмотреть сообщение
// Проверка, чтобы все потоки завершились
жестяк № 3

Добавлено через 26 секунд
Massaraksh7, поучи потоки, пожалуйста
0
Айлурофил
 Аватар для Massaraksh7
518 / 451 / 112
Регистрация: 27.05.2017
Сообщений: 2,749
Записей в блоге: 7
06.08.2017, 10:36
Цитата Сообщение от DenNik Посмотреть сообщение
Massaraksh7, поучи потоки, пожалуйста
Понадобятся в реальной работе - подучу.
Хотя этот код работает.
-0.50
1 / 0 / 0
Регистрация: 03.08.2017
Сообщений: 37
06.08.2017, 10:54  [ТС]
Единственная проблема ещё осталась всё-таки, во втором потоке в цикле присваивается переменной code значение, но в первом потоке она почему-то постоянно пустая, как так?) переменную объявил для потоков в
Delphi
1
TmThread= class(TThread)
Добавлено через 2 минуты
Объявил переменную так
Delphi
1
2
3
var
  Form1: TForm1;
  code: string;
и всё заработало, вдруг кому-то пригодится
-0.50
6000 / 4575 / 1096
Регистрация: 29.08.2013
Сообщений: 28,255
Записей в блоге: 3
06.08.2017, 11:09
Цитата Сообщение от jerekito Посмотреть сообщение
вдруг кому-то пригодится
то так не делайте

все что связано с потоками должно быть описано в классе потока
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
06.08.2017, 11:12
Цитата Сообщение от Massaraksh7 Посмотреть сообщение
Хотя этот код работает.
если пишешь для себя - то кому какая разница, но не нужно учить других делать неправильно!

Цитата Сообщение от Massaraksh7 Посмотреть сообщение
Form16.xsum:=Form16.xsum+sum; // Добавляет в общую сумму
этот код работает, не вопрос, однако
1. узкое место - название формы, изменишь название, придется менять код потока.
2. следуя правилу "отделять данные от реализации" - поток не должен куда-то выводить данные, кроме своих полей. он сделал работу, забирать данные - задача вызывающего. для этого у потока есть событие OnTerminate, которое, внезапно, срабатывает, когда поток завершил работу и которое работает в коде вызывающего (т.е. спокойно может быть методом формы)

Цитата Сообщение от Massaraksh7 Посмотреть сообщение
Terminate; // Завершение потока
это вызывает лишь улыбку. код Execute полностью выполнен, поток завершил работу. на кой вызывать Terminate?
1
Айлурофил
 Аватар для Massaraksh7
518 / 451 / 112
Регистрация: 27.05.2017
Сообщений: 2,749
Записей в блоге: 7
06.08.2017, 11:41
Цитата Сообщение от DenNik Посмотреть сообщение
это вызывает лишь улыбку. код Execute полностью выполнен, поток завершил работу. на кой вызывать Terminate?
Улыбка - это хорошо. Но без этой строки не работает, можете проверить. А на кой бы я её туда вставлял?

Добавлено через 10 минут
https://youtu.be/a0U_JfJbTZM
0
1 / 0 / 0
Регистрация: 03.08.2017
Сообщений: 37
06.08.2017, 12:09  [ТС]
ребят, ещё ошибка, переменная code1 с одного потока номер 1 и переменная code2 с потока номер 2, выскакивает ошибка при выполнении в 3 потоке
Delphi
1
codeResult := code1 + code2;
Если не объединять их то работает все норм, а так вылетает ошибка Access Violation to address. Может выскакивать и сразу, и через секунды 2 после запуска потоков. В code1 и code2 по hex строке

Добавлено через 5 минут
Access violation at address 00403168 in module 'Project1.exe'. Read of address 0000003D
0
6000 / 4575 / 1096
Регистрация: 29.08.2013
Сообщений: 28,255
Записей в блоге: 3
06.08.2017, 12:09
а весь код можно посмотреть?
0
1 / 0 / 0
Регистрация: 03.08.2017
Сообщений: 37
06.08.2017, 12:11  [ТС]
Видимо это было из-за того, что не правильно по очереди запустил потоки. Хотя выставил их в нужном порядке, ошибка бывает выскакивает. Из-за чего вообще может быть?
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
06.08.2017, 12:12
Цитата Сообщение от Massaraksh7 Посмотреть сообщение
Но без этой строки не работает, можете проверить
Terminate не завершает работу потока, он просто устанавливает флаг Terminated в true и все. это может служить для прерывания работы потока извне, тогда ты можешь в работе потока (например, если там цикл) проверять:
Delphi
1
if Tеrminated then Break;
но это не относится к данному примеру. еще раз обращаю внимание на событие OnTerminate, в котором ты можешь получить итоговую сумму из каждого потока в контексте главного потока (a.k.a. формы) при завершении работы потока. и без глупых проверок типа
Delphi
1
2
3
4
5
6
7
// Проверка, чтобы все потоки завершились
repeat
   begin
   k:=0;
   for i:=0 to 10 do if Th[i].Terminated=True then inc(k);
   end;
until (k=11);
0
Айлурофил
 Аватар для Massaraksh7
518 / 451 / 112
Регистрация: 27.05.2017
Сообщений: 2,749
Записей в блоге: 7
06.08.2017, 12:27
А объясните мне, почему так работает:
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
64
65
66
67
68
69
70
71
72
73
74
75
76
unit UThr;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type TMyThread=class(TThread)
   private
     { Private declarations }
   protected
   procedure Execute; override;
   public
   startvalue:integer;  // начальное значение суммирования
   stopvalue:integer;   // конечное значение суммирования
   sum:integer;         // сумма-результат потока
   end;
 
 
type
  TForm16 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  Th:array [0..10] of TMyThread; // 11 потоков
  xsum:integer;                  // Общая сумма всех потоков
  tc:integer;
  procedure OnTerm(Sender:TObject);
  end;
 
var
  Form16: TForm16;
 
implementation
 
{$R *.dfm}
 
procedure TMyThread.Execute;
var i:integer;
begin
sum:=0; // сумма потока
for i:=startvalue to stopvalue do sum:=sum+i; // Поток работает и считает от своего начального значения до конечного
//Terminate; // Завершение потока
end;
 
procedure TForm16.OnTerm(Sender: TObject);
begin
inc(tc);
xsum:=xsum+(Sender as TMyThread).sum; // Добавляет в общую сумму
end;
 
procedure TForm16.Button1Click(Sender: TObject);
var i,k:integer;
begin
for i:=0 to 10 do
   begin
   Th[i]:=TMyThread.Create(True);   // Создание 11 потоков
   Th[i].FreeOnTerminate:=True;
   Th[i].OnTerminate:=OnTerm;
   Th[i].startvalue:=i*1000;        // Распределение начальной и конечной
   Th[i].stopvalue:=i*1000+1000-1;  // сумм по потокам
   end;
xsum:=0; // Общая сумма=0
tc:=0;
for i:=0 to 10 do Th[i].Start; // Запуск 11 потоков
 
while (tc<>11) do Application.ProcessMessages;
///------Потоки завершились
Button1.Caption:=IntToStr(xsum);
end;
 
end.
А если я меняю строку 71 на
Delphi
1
while (tc<>11) do ;
Не работает?
0
1 / 0 / 0
Регистрация: 03.08.2017
Сообщений: 37
06.08.2017, 12:30  [ТС]
Нашел строку из-за которой ошибка,
Delphi
1
j := RandomRange(0, 255);
в цикле ганяет до 255, когда j := 255 то ему присваивается рандомное число и он продолжает работать
0
6000 / 4575 / 1096
Регистрация: 29.08.2013
Сообщений: 28,255
Записей в блоге: 3
06.08.2017, 12:46
какой нафиг
Цитата Сообщение от Massaraksh7 Посмотреть сообщение
Application.ProcessMessages
???
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.08.2017, 12:46

Можно ли модули, написанные на Python, использовать в программе, которая пишется на Delphi? И если можно, то как?
Можно ли модули написанные на Python, использовать в программе которая пишется на Delphi? И если можно, то как?

Как можно создать последовательность разных кадров (изображений) в одном слое в программе KoolMoves
Расскажите, пожалуйста, как можно создать последовательность разных кадров в одном слое в программе KoolMoves? Я пробовал создать...

Есть исходник DLL на Delphi как (и возможно ли) написать похожее на VB.NET и использовать в среде программы написанной на Delphi
Суть вопроса вкратце такова - Есть исходник DLL написанной на Delphi Library Extdll; uses SysUtils, Windows; type ...

Как подключить графику к написанной программе?
Здравствуйте. Я совсем новичок в программировании, попытался написать программу шахмат. У меня почти все получилось, но есть проблема. Вся...

Как подключить код на С к программе написанной на VB
Вопрос такой как подключить кусок кода на С (С++) к программе на VB. Мне нужно не просто запустить код на выполнение а еще организовать...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru