Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
-11 / 9 / 1
Регистрация: 20.06.2021
Сообщений: 790
RAD 2009-XE2

Как подождать завершения потоков ?

07.10.2023, 12:10. Показов 4314. Ответов 69
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здрасте, пишу свой .pas модуль он подразумевает многопоточность, подскажите пожалуйста как правильно подождать пока все потоки не завершаться, перерыл весь интернет ничего нормально работающего не нашёл кроме такого костыля с Win32Check который так же работает через раз к сожалению:

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
unit testlib;
 
interface
 
uses
  SysUtils,
  Classes,
  System.syncobjs,
  windows,
  System.Generics.Collections;
 
type
 Ttestlib= class
private
published
function Testy(const threads:integer): string;
constructor Create;
destructor Destroy; override;
end;
 
type
th = class(TThread)
private
protected
  procedure Execute; Override;
public
  constructor create(createsuspended:boolean);
end;
 
var
work:boolean=true;
Event: THandle;
cs:TcriticalSection;
 
implementation
 
{ th }
 
constructor th.create(createsuspended: boolean);
begin
inherited Create(CreateSuspended);
FreeOnTerminate := True;
end;
 
procedure th.Execute;
begin
inherited;
while work do begin
cs.Enter;
//КОД
cs.Leave;
if work then begin
//КОД
end;
end;
end;
 
{ Ttestlib }
 
constructor Ttestlib.Create;
begin
//Создадим нужные компоненты
end;
 
destructor Ttestlib.Destroy;
begin
inherited;
work:=False;
//Освободим Нужные компоненты
end;
 
function Ttestlib.Testy(const threads:integer): string;
var
i:integer;
thrs:th;
begin
Result:='';
ResetEvent(Event);
for I := 0 to threads-1 do begin
thrs:=th.create(False);
// Костыль ожидания завершения всех потоков:
Win32Check(DuplicateHandle(
      GetCurrentProcess,
      thrs.Handle,
      GetCurrentProcess,
      @Event,
      0,
      False,
      DUPLICATE_SAME_ACCESS
    ));
  end;
thrs.FreeOnTerminate:=True;
WaitForSingleObject(Event, INFINITE); // Само ожидание
CloseHandle(Event);
Result:='ГОТОВО';
end;
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.10.2023, 12:10
Ответы с готовыми решениями:

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

Как подождать завершения приложения (по имени окна)
Бывает что мы запускаем какую та программу программно и нужно дождаться ее завершения. Можно конечно отслеживать процесс и т.п. или имя...

Как дождаться завершения всех работающих потоков?
type th = class(TThread) private public protected constructor Create(createsuspended:boolean); procedure Execute;...

69
10.10.2023, 01:33
Студворк — интернет-сервис помощи студентам

Не по теме:

Цитата Сообщение от krapotkin Посмотреть сообщение
но мы уже который раз рассматриваем какие-то измышления в стиле "а вот если..."
Да собственно все ветки созданные ТС такие.
Метод ненаучного тыка.

0
-11 / 9 / 1
Регистрация: 20.06.2021
Сообщений: 790
10.10.2023, 08:42  [ТС]
Цитата Сообщение от Constcat Посмотреть сообщение
А если последний завершится раньше, чем любой из предыдущих?
Такого на практике не происходит на самом деле работает стабильно
0
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
10.10.2023, 08:50
Цитата Сообщение от Uefi220 Посмотреть сообщение
Такого на практике не происходит на самом деле работает стабильно
Практика у всех бывает разная.
И частота пробуждения системой потоков, равно как и порядок их вызовов не гарантирован.
0
-11 / 9 / 1
Регистрация: 20.06.2021
Сообщений: 790
10.10.2023, 09:21  [ТС]
Цитата Сообщение от Constcat Посмотреть сообщение
Практика у всех бывает разная.
И частота пробуждения системой потоков, равно как и порядок их вызовов не гарантирован.
Ну проверь мой код увидишь что всё по сути работает
0
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
10.10.2023, 09:24
Цитата Сообщение от Uefi220 Посмотреть сообщение
Ну проверь мой код увидишь что всё по сути работает
Зачем мне его проверять, если известна теория?
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,496
10.10.2023, 09:47
Цитата Сообщение от Uefi220 Посмотреть сообщение
Последнему потоку отключаем самоуничтожение, а остальным включаем в Create, так как последний уничтожаем вручную
А кто гарантирует, что созданный последним поток завершится именно последним?
0
-11 / 9 / 1
Регистрация: 20.06.2021
Сообщений: 790
10.10.2023, 10:47  [ТС]
Цитата Сообщение от AzAtom Посмотреть сообщение
А кто гарантирует, что созданный последним поток завершится именно последним?
Какой нибудь гарант
0
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
10.10.2023, 12:42
Цитата Сообщение от Uefi220 Посмотреть сообщение
Какой нибудь гарант
Ну, тогда есть смысл ему вопросы задавать.
0
-11 / 9 / 1
Регистрация: 20.06.2021
Сообщений: 790
10.10.2023, 13:43  [ТС]
Цитата Сообщение от krapotkin Посмотреть сообщение
я теряю интерес. каждый уже по два раза написал, как НАДО
но мы уже который раз рассматриваем какие-то измышления в стиле "а вот если..."
Ты мне написал с одним потоком только и в приостановленном состоянии, а с одним потоком ежу понятно как сделать
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,684
Записей в блоге: 21
10.10.2023, 17:41
я написал для N потоков
программа просто не делает НИЧЕГО, кроме подсчета, сколько потоков вернулось, а сколько было запущено
как только счетчик завершенных потоков сравняется с количеством запущенных, делаем то, что хотели делать после
WaitFor.
всё.

все остальные идеи с завешиванием программы и другой разной требухой делайте самостоятельно)
0
-11 / 9 / 1
Регистрация: 20.06.2021
Сообщений: 790
10.10.2023, 18:05  [ТС]
Цитата Сообщение от krapotkin Посмотреть сообщение
я написал для N потоков
Я честно пересмотрел ещё раз не нашёл где ты для N потоков написал )
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,496
10.10.2023, 20:35
Uefi220, N раз выполни эти действия по запуску потока и будет тебе N потоков. Не глядя и я оказывается то же самое следом написал. Только весь модуль. Готовый код. Видимо, проблема в том, что ты не хочешь его адаптировать под свою задачу.

Не по теме:

Вообще, эта тема давно похожа на троллинг.

0
-11 / 9 / 1
Регистрация: 20.06.2021
Сообщений: 790
10.10.2023, 21:00  [ТС]
Цитата Сообщение от AzAtom Посмотреть сообщение
N раз выполни эти действия по запуску потока и будет тебе N потоков. Не глядя и я оказывается то же самое следом написал. Только весь модуль. Готовый код. Видимо, проблема в том, что ты не хочешь его адаптировать под свою задачу.
Я просто не хочу использовать массив потоков и жду может другого решения потому что вызывать два цикла for
0
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
10.10.2023, 21:30
Цитата Сообщение от Uefi220 Посмотреть сообщение
Я просто не хочу использовать массив потоков
Это какой-то религиозный запрет?
Вы пытаетесь контролировать систему одним из элементов системы. Так не получится. Либо получится, но случайно.
Не получится одним из равноценных потоков контролировать остальные. Как я уже говорил, нет никаких гарантий, что этот поток не завершиться раньше остальных.
0
-11 / 9 / 1
Регистрация: 20.06.2021
Сообщений: 790
10.10.2023, 22:42  [ТС]
Цитата Сообщение от Constcat Посмотреть сообщение
Не получится одним из равноценных потоков контролировать остальные. Как я уже говорил, нет никаких гарантий, что этот поток не завершиться раньше остальных.
Ну попробуй докажи что этот поток завершается раньше остальных тогда будем думать ещё
0
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
10.10.2023, 22:58
Цитата Сообщение от Uefi220 Посмотреть сообщение
Ну попробуй докажи что этот поток завершается раньше остальных тогда будем думать ещё
Ты меня ни с кем не спутал?
Требуй доказательств у WinAPI, где указано, что нет никаких гарантий ни о порядке запуска потоков, ни о паузах между переключении между потоками.
0
-11 / 9 / 1
Регистрация: 20.06.2021
Сообщений: 790
10.10.2023, 23:03  [ТС]
Цитата Сообщение от Constcat Посмотреть сообщение
Требуй доказательств у WinAPI, где указано, что нет никаких гарантий ни о порядке запуска потоков
Да вот сейчас протестировал действительно иногда быстрее потоки завершаются =(
Так и не понял как сделать правильно как то так ?:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
constructor th.create(createsuspended: boolean);
begin
inherited Create(CreateSuspended);
FreeOnTerminate := True;
end;
 
function Ttestlib.Testy(const threads:integer): string;
var
i:integer;
thrs: array of th;
begin
Result:='';
SetLength(thrs,threads);
for I := 0 to threads-1 do begin
thrs[i]:=th.create(False);
thrs[i].FreeOnTerminate:=False;
end;
for I := 0 to threads-1 do begin
thrs[i].WaitFor;
thrs[i].Free;
end;
Result:='Готово!';
end;
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,496
11.10.2023, 09:21
Цитата Сообщение от Uefi220 Посмотреть сообщение
как сделать правильно как то так ?:
Как сделать правильно - уже выше написали. Но если тебе нужно (зачем-то) именно подвесить всю программу до завершения потоков, то да, можно и так.
0
-11 / 9 / 1
Регистрация: 20.06.2021
Сообщений: 790
11.10.2023, 19:05  [ТС]
Цитата Сообщение от AzAtom Посмотреть сообщение
всю программу до завершения потоков, то да, можно и так.
Можно ли обойтись одним циклом ?)
0
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
11.10.2023, 19:44
Цитата Сообщение от Uefi220 Посмотреть сообщение
Можно ли обойтись одним циклом
Один цикл для запуска.
Один цикл для завершения.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.10.2023, 19:44

Ожидание завершения потоков
Подскажите пж. как дождатся окончание выполнения потоков в unit-2 и потом продолжить в unit-3 чет не получается с условием так как в 22...

Ожидание завершения работы потоков
допустим есть программа, которая многопоточно отправляет get запросы через idhttp сначала на первый адрес из списка, затем на второй, на...

Как подождать ShellExecute?
Запускаю WinRar таким образом: //делит на указанные части procedure divisionFile(FileNameIn, FileNameOut: string; sizedivision:...

Как подождать завершения Task?
Есть WPF приложение, в нем в определённый момент запускается такая штука: Task fillTable = new Task(() => { ...

Как подождать завершения потока
Добрый день вот такое дело. не Могу РАЗОБРАТЬ ПРИНЦИП ОЖИДАНИЯ завершения потоков. Т.е. запустили мы 4 потока для 4 ядерного цпу и...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
Цена ошибки
DevAlt 23.08.2026
Человек я беспокойный и потому заинтересовался OCaml, в чате форсили функторы модулей как суперфичу. Пытаясь отдуплить концепт, наткнулся на тутор с простым примером. А главный принцип обучения от. . .
Сегодня суббота, 22.08.2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины.
zorxor 22.08.2026
Сегодня суббота, 22. 08. 2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины. Кто Я, откуда Я пришел и куда Я иду? Эти вопросы не оставляют меня ни на секунду. Жизнь на планете Земля. . .
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru