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

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

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

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

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

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

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

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

57
Айлурофил
441 / 375 / 107
Регистрация: 27.05.2017
Сообщений: 2,155
Записей в блоге: 1
06.08.2017, 12:52 41
Author24 — интернет-сервис помощи студентам
Что не так?
0
5785 / 4527 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
06.08.2017, 13:46 42
Цитата Сообщение от Massaraksh7 Посмотреть сообщение
while (tc<>11) do ;
потому что пока ваша программа работает, никакие переменные в ней никаким магическим образом не поменяются
поэтому успокойтесь. не нужно бесконечных циклов. отпустите программу обрабатывать вашу мыш и кноподоску.

когда поток завершился, он придет в OnTerm. Там и проверяйте. Если количество завершенных=кол-ву запущенных, выводите сумму на экран
0
Айлурофил
441 / 375 / 107
Регистрация: 27.05.2017
Сообщений: 2,155
Записей в блоге: 1
06.08.2017, 13:56 43
Цитата Сообщение от krapotkin Посмотреть сообщение
поэтому успокойтесь. не нужно бесконечных циклов. отпустите программу обрабатывать вашу мыш и кноподоску.
когда поток завершился, он придет в OnTerm. Там и проверяйте. Если количество завершенных=кол-ву запущенных, выводите сумму на экран
А конкретней можно?
Если логика программы подразумевает:
1. Запустить потоки.
2. Дождаться окончания их работы.
3. Получить результат работы.
4. Делать что-то с этим результатом дальше.
4а. На экране мне никаких сумм не нужно.
То как должен выглядеть код?

Добавлено через 5 минут
Цитата Сообщение от krapotkin Посмотреть сообщение
потому что пока ваша программа работает, никакие переменные в ней никаким магическим образом не поменяются
Но потоки-то тоже работают. И в предыдущем коде магия таки происходит.
0
5785 / 4527 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
06.08.2017, 13:56 44
логика программы
запустить потоки
при окончании подсчитывать сколько еще осталось
когда закончился последний, делать что-то с этим результатом дальше
что не так?
0
Айлурофил
441 / 375 / 107
Регистрация: 27.05.2017
Сообщений: 2,155
Записей в блоге: 1
06.08.2017, 13:59 45
Лукавите. В коде это как будет выглядеть? На примере моего кода можете показать?
0
5785 / 4527 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
06.08.2017, 15:19 46
как-то подзадолбало уже.
я в первом же ответе дал ссылку на пример, который показывает, как разделить работу по потокам, при этом контролируя кол-во одновременно запущенных
вот вам второй раз
запустить 1000 потоков 10 одновременно
при завершении каждого проверять
а) нужны ли еще потоки
б) все ли потоки завершились

Кликните здесь для просмотра всего текста
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
unit Unit1;
 
interface
 
uses
  classes, types, forms, ExtCtrls, Controls, StdCtrls, SysUtils, Dialogs,
  System.Generics.Collections, vcl.imaging.jpeg;
 
type
  TMyThread=class(TThread)
    FCount:integer;
    Result:integer;
    constructor Create(ACount:integer; TermProc:TNotifyEvent);
    procedure Execute; override;
  end;
 
 
  TForm1 = class(TForm)
    bStart: TButton;
    m1: TMemo;
    procedure bStartClick(Sender: TObject);
  private
    T1:int64;
    Started:integer;
    Finished:integer;
    Sum:integer;
    procedure ThreadTerminated(Sender: TObject);
    procedure RunThread;
  end;
 
var
  Form1: TForm1;
 
implementation
 
const
  max_th=1000;
  max_same_time=10;
 
 
{$R *.dfm}
 
 
{ TForm1 }
 
 
procedure TForm1.RunThread;
var
  th:TMyThread;
begin
  th:=TMyThread.Create(random(20),ThreadTerminated);
//  m1.lines.add('begin -- '+inttostr(Started));
  th.Start;
  Inc(Started);
end;
 
procedure TForm1.bStartClick(Sender: TObject);
begin
  bStart.Enabled := false;
  m1.lines.clear;
  t1:=TThread.GetTickCount;
  Started := 0;
  Finished := 0;
  Sum := 0;
  while Started < max_same_time do
    runThread;
end;
 
 
procedure TForm1.ThreadTerminated(Sender:TObject);
var
  th:TMyThread absolute Sender;
begin
  Inc(Finished);
//  m1.lines.add('end -- '+inttostr(th.Result));
  Sum:=Sum+th.Result;
 
  if Started<max_th then
    RunThread;
 
  if Finished=max_th then
  begin
    m1.lines.add('========================');
    m1.lines.add('Итог: '+inttostr(sum));
    m1.Lines.Add(IntToStr(max_th)+' threads');
    m1.Lines.Add(IntToStr(TThread.GetTickCount-t1)+' msec');
    bStart.Enabled:=true;
  end;
end;
 
 
{ TMyThread }
constructor TMyThread.Create(ACount: integer; TermProc: TNotifyEvent);
begin
  inherited Create(true);
  FreeOnTerminate := true;
  FCount := ACount;
  OnTerminate := TermProc;
end;
 
 
procedure TMyThread.Execute;
var
  i: Integer;
begin
  for i := 0 to FCount-1 do
    result := result + Random(100);
end;
 
end.
Миниатюры
Можно ли и как запустить в программе, написанной на Delphi 7, 12 разных циклов одновременно?  
0
Айлурофил
441 / 375 / 107
Регистрация: 27.05.2017
Сообщений: 2,155
Записей в блоге: 1
06.08.2017, 21:54 47
(Со вздохом) Хорошо, если после получения итога, как в Вашем примере, этот итог не нужно выводить на экран, а нужно провести с ним сложные вычисления, возможно, с новыми созданиями потоков (как это будет в реале, а не в учебном коде, например при анализе позиций шахматной партии), Вы это тоже продолжите делать в процедуре ThreadTerminated?
0
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,252
07.08.2017, 02:04 48
Цитата Сообщение от jerekito Посмотреть сообщение
ребят, ещё ошибка, переменная code1 с одного потока номер 1 и переменная code2 с потока номер 2, выскакивает ошибка при выполнении в 3 потоке
Delphi
Выделить код
1
codeResult := code1 + code2;
Если не объединять их то работает все норм, а так вылетает ошибка Access Violation to address. Может выскакивать и сразу, и через секунды 2 после запуска потоков. В code1 и code2 по hex строке
А я давно уже спрашивал
А что такое "общее значение среди них"?
Теперь спрашиваю а что значит "Если не объединять их"?
0
5785 / 4527 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
07.08.2017, 07:30 49
Цитата Сообщение от Massaraksh7 Посмотреть сообщение
Вы это тоже продолжите делать в процедуре ThreadTerminated?
объясните, в чем разница - вывести результат в мемо и
Цитата Сообщение от Massaraksh7 Посмотреть сообщение
нужно провести с ним сложные вычисления
и даже
Цитата Сообщение от Massaraksh7 Посмотреть сообщение
с новыми созданиями потоков
Если вы посмотрите на код, то увидите как раз запуск новых потоков.

результат все равно будет готов только когда закончится последний поток
раньше этого момента ваша программа может только
а) "зависнуть", не реагируя на внешние раздражители
б) работать как обычно с мышью и клавиатурой (ну, если есть хоть одно ядро свободное от массы потоков)

когда вы загружаете страницу в браузере, он производит скачивание 10-20 файлов, и до черта всяких "сложных вычислений" и при этом вы все еще можете просто прибить страницу и не ждать, при этом все остальные как работали так и работают! хотя они тоже могли сделать цикл "пока все не загрузится, пусть пользователь пойдет почитает книгу"
0
Айлурофил
441 / 375 / 107
Регистрация: 27.05.2017
Сообщений: 2,155
Записей в блоге: 1
07.08.2017, 08:51 50
Понятно, каждый из нас рассуждает, имея в виду свои категории задач.
Я рассуждаю о потоках, имея в виду, в основном, категории вычислительных задач прямой логики, когда длинные вычисления разбиваются на потоки с целью уменьшения времени (типа расчета шахматных позиций, или математических вычислений), и в это время можно, конечно, пощёлкать мышкой или набрать что-то на клавиатуре, но - зачем? И в этом случае мой подход вполне работает.
У Вас рассуждения о задачах параллельной логики, где будет работать именно Ваш подход.
На этом и остановимся.
0
5785 / 4527 / 1431
Регистрация: 14.04.2014
Сообщений: 20,157
Записей в блоге: 20
07.08.2017, 11:01 51
если бы вам было все равно, висит программа или нет, вы не лепили бы Application.ProcessMessages, которая вам нужна именно для обновления UI и работы с вводом. а на деле имеет спецэффекты

главный цикл программы Application.Run как раз и представляет собой бесконечный цикл с обработкой Application.ProcessMessages. Не надо его дублировать, запуская второе кольцо в обработчике, из которого опять можно попасть в обработчик и т.д.
0
Житель Земли
3002 / 3004 / 391
Регистрация: 26.07.2011
Сообщений: 11,463
Записей в блоге: 1
07.08.2017, 11:03 52
Цитата Сообщение от Massaraksh7 Посмотреть сообщение
если после получения итога, как в Вашем примере, этот итог не нужно выводить на экран, а нужно провести с ним сложные вычисления
Massaraksh7, вникни. обрати такде внимание на очередность завершения работы потоков. она всегда разная
Кликните здесь для просмотра всего текста
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
77
78
79
80
81
82
83
84
85
86
87
88
unit Unit1;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
 
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure EndThreadWork(Sender: TObject);
  end;
 
  TMyThread = class(TThread)
    FThreadNumber: byte;
    FStartValue: integer;
    FEndValue: integer;
    FResult: integer;
  protected
    procedure Execute; override;
  end;
 
var
  Form1: TForm1;
  thrCount: byte;
  totalSumm: integer;
 
implementation
 
{$R *.dfm}
 
{ TMyThread }
 
procedure TMyThread.Execute;
var
  i: word;
begin
  FResult:= 0;
  for i:= FStartValue to FEndValue do
    FResult:= FResult + i;
end;
 
// ========================================================================================
 
procedure TForm1.Button1Click(Sender: TObject);
var
  i: byte;
  MyThread: TMyThread;
begin
  // START
  Memo1.Clear;
  thrCount:= 11;
  totalSumm:= 0;
  // create Threads
  for i:= 0 to Pred(thrCount) do
  begin
    MyThread:= TMyThread.Create(true);
    MyThread.FreeOnTerminate:= true;
    MyThread.OnTerminate:= EndThreadWork;
    MyThread.FThreadNumber:= i;    // для контроля
    MyThread.FStartValue:= i * 1000;
    MyThread.FEndValue:= i * 1000 + 999;
    MyThread.Start;
  end;
end;
 
// ========================================================================================
 
procedure TForm1.EndThreadWork(Sender: TObject);
var
  MyThread: TMyThread absolute Sender;
begin
  // очередной поток завершил работу. считывание результата
  Memo1.Lines.Add(Format('Поток %d завершил работу. Результат %d',[MyThread.FThreadNumber,MyThread.FResult]));
  totalSumm:= totalSumm + MyThread.FResult;
  Dec(thrCount);
  if thrCount = 0 then  // все потоки завершили работу
  begin
    Memo1.Lines.Add('=========================');
    Memo1.Lines.Add(Format('Total Summ: %d',[totalSumm]));
    // МОЖЕШЬ ТЕПЕРЬ ХОТЬ ДО СКОНЧАНИЯ ВЕКОВ ПРОИЗВОДИТЬ СЛОЖНЫЕ ВЫЧИСЛЕНИЯ С РЕЗУЛЬТАТОМ!
  end;
end;
 
end.
Миниатюры
Можно ли и как запустить в программе, написанной на Delphi 7, 12 разных циклов одновременно?   Можно ли и как запустить в программе, написанной на Delphi 7, 12 разных циклов одновременно?   Можно ли и как запустить в программе, написанной на Delphi 7, 12 разных циклов одновременно?  

0
Айлурофил
441 / 375 / 107
Регистрация: 27.05.2017
Сообщений: 2,155
Записей в блоге: 1
07.08.2017, 11:30 53
krapotkin, я вовсе не настаиваю на том, что это должен быть цикл с ProcessMessages. Логичней, конечно, применить WaitForSingleObject, через семафоры.

Добавлено через 2 минуты
Цитата Сообщение от DenNik Посмотреть сообщение
Massaraksh7, вникни. обрати такде внимание на очередность завершения работы потоков. она всегда разная
Delphi
1
// МОЖЕШЬ ТЕПЕРЬ ХОТЬ ДО СКОНЧАНИЯ ВЕКОВ ПРОИЗВОДИТЬ СЛОЖНЫЕ ВЫЧИСЛЕНИЯ С РЕЗУЛЬТАТОМ!
Но я не хочу их здесь производить. Я их хочу производить в основной ветке, где у меня уже настроены все локальные переменные.
0
Житель Земли
3002 / 3004 / 391
Регистрация: 26.07.2011
Сообщений: 11,463
Записей в блоге: 1
07.08.2017, 11:35 54
Цитата Сообщение от Massaraksh7 Посмотреть сообщение
Я их хочу производить в основной ветке,
что такое основная ветка?
0
Айлурофил
441 / 375 / 107
Регистрация: 27.05.2017
Сообщений: 2,155
Записей в блоге: 1
07.08.2017, 11:41 55
То место, где я запустил процессы. Я же написал, что речь идёт о задачах прямой логики, где последовательность действий жёсткая.
0
Житель Земли
3002 / 3004 / 391
Регистрация: 26.07.2011
Сообщений: 11,463
Записей в блоге: 1
07.08.2017, 11:50 56
Цитата Сообщение от Massaraksh7 Посмотреть сообщение
То место, где я запустил процессы.
потоки именно для того и предназначены, чтобы не ждать, пока выполнится задача, а делать другие действия (с точки зрения приложения, выполнять основной поток без "зависаний"). а у тебя как: запустил потоки и ждешь пока они завершатся, постоянно проверяя их завершение!. вот это и есть глупо. их не надо проверять постоянно, как школьника, сделал ли он уроки. потоки сами отсалютуют о завершении, если ты их об этом попросишь.

Цитата Сообщение от Massaraksh7 Посмотреть сообщение
речь идёт о задачах прямой логики, где последовательность действий жёсткая.
во-первых, что такое "прямая логика"? во-вторых, любую логику можно запрограммировать по-разному
0
Айлурофил
441 / 375 / 107
Регистрация: 27.05.2017
Сообщений: 2,155
Записей в блоге: 1
07.08.2017, 12:10 57
Простой пример: запусти любую шахматную программу и проверь: какие действия ты можешь совершить, пока она думает?
Или напиши программу расчета n! для больших n, и определи: какие "другие действия" нужно выполнять пока она считает?
0
Житель Земли
3002 / 3004 / 391
Регистрация: 26.07.2011
Сообщений: 11,463
Записей в блоге: 1
07.08.2017, 12:32 58
Цитата Сообщение от Massaraksh7 Посмотреть сообщение
запусти любую шахматную программу и проверь: какие действия ты можешь совершить, пока она думает?
если эта программа создает впечатление "зависшей", пока она думает, то это проблемы квалификации программиста, писавшего ее, не стоит наследовать этот пример

Цитата Сообщение от Massaraksh7 Посмотреть сообщение
какие "другие действия" нужно выполнять
хотя бы свернуть "думающую" шахматную программу
0
07.08.2017, 12:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.08.2017, 12:32
Помогаю со студенческими работами здесь

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

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

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

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

Можно ли в разных lock() одновременно использовать один и тот же объект синхронизации
Можно ли в разных lock() одновременно использовать один и тот же объект синхронизации для доступа к...

Как взломать программу написанной Delphi
Здравствуйте Уважаемые Эксперты! Есть программа написанной (по моему) на BobSoft Mini Delphi. PEiD...


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

Или воспользуйтесь поиском по форуму:
58
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru