1 / 0 / 0
Регистрация: 25.10.2019
Сообщений: 69

Как остановить все потоки разом?

25.02.2020, 16:34. Показов 2206. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
вот код программы после запуска с помощью левой кнопки мыши я создаю потоки(шарики) и с помощью правой кнопки мыши надо остановить все потоки одним щелчком , но у меня завершается только последний поток, помогите!!!!
КОД ПРОГРАММЫ
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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;
 
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
HThread: THandle;
ThreadID: DWORD;
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure PaintEllipse;
const D=30;
var
x, y: integer;
Direction: Boolean;
dirx, diry: -1..1;
dc: hdc;
Rect: TRect;
begin
dc:=getdc(Form1.Handle);
x:=10; y:=10;
Direction:=True;
dirx:=1; diry:=1;
repeat
with Rect do
begin
Left :=x;
Top:=y;
Right:=x+D;
Bottom:=y+D;
end;
FillRect (dc, Rect, COLOR_BTNFACE+1);
if Direction then x:=x+dirX else y:=y+dirY;
if x>Form1.ClientWidth-10-D then
begin
dirX:=-1; Direction:=False; x:=Form1.ClientWidth-10-D;
end;
if x<10 then
begin
dirX:=1; Direction:=False; x:=10;
end;
if y>Form1.ClientHeight-10-D then
begin
Direction:=True; dirY:=-1; y:=form1.ClientHeight-10-D;
end;
if y<10 then
begin
Direction:=True; dirY:=1; y:=10;
end;
Ellipse (dc, x, y, x+D, y+D);
Sleep (5);
until False;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
HThread:=CreateThread (nil, 0, @PaintEllipse, nil, 0, ThreadId);
end;
 
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  If button = MbRight then
   TerminateThread(HThread,ThreadId);
end;
end.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.02.2020, 16:34
Ответы с готовыми решениями:

Многопоточность. Как остановить все потоки разом?
Сделал как тут: http://avtuh.ru/2010/10/10/delphi-videourok-mnogopotochnost-i-sinxronizaciya.html Как можно остановить разом все потоки?

Разом уничтожить все потоки
Всем привет! Создаю несколько потоков таким образом: int i = 0; for (Form3-&gt;ADOQuery1-&gt;First(); !Form3-&gt;ADOQuery1-&gt;Eof;...

Как по нажатию кнопки остановить все потоки?
Есть программа которая считает файлы в указанной директории public class CountFilesTest { public static void main(String args)...

4
Модератор
4149 / 2360 / 812
Регистрация: 15.11.2015
Сообщений: 9,462
25.02.2020, 17:09
Лучший ответ Сообщение было отмечено PAVEL_2 как решение

Решение

Нужно запоминать идентификатор каждого потока, тогда можно будет к ним обращаться.
И лучше вот так не прерывать выполнение. Нужно сделать флаг, который если установлен, то цикл будет завершаться.

Добавлено через 6 минут
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
var
  Form1: TForm1;
  TerminateThread: boolean;
 
implementation
 
{$R *.dfm}
 
procedure PaintEllipse;
const
  D = 30;
var
  x, y: integer;
  Direction: Boolean;
  dirx, diry: -1..1;
  dc: hdc;
  Rect: TRect;
begin
  dc := getdc(Form1.Handle);
  x := 10;
  y := 10;
  Direction := True;
  dirx:=1;
  diry:=1;
  repeat
...
  until TerminateThread;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  TerminateThread := false;
//  HThread:=
  CreateThread (nil, 0, @PaintEllipse, nil, 0, ThreadId);
end;
 
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  If button = MbLeft then begin
    TerminateThread := false;
    CreateThread (nil, 0, @PaintEllipse, nil, 0, ThreadId);
  end;
  If button = MbRight then
    TerminateThread := true;
//   TerminateThread(HThread,ThreadId);
end;
 
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  TerminateThread := true;
end;
 
end.
1
1 / 0 / 0
Регистрация: 25.10.2019
Сообщений: 69
25.02.2020, 17:23  [ТС]
теперь вообще не какой поток не завершается
0
Модератор
4149 / 2360 / 812
Регистрация: 15.11.2015
Сообщений: 9,462
25.02.2020, 17:25
Лучший ответ Сообщение было отмечено PAVEL_2 как решение

Решение

PAVEL_2, цикл в потоке надо не until false, а until TerminateThread.
1
1 / 0 / 0
Регистрация: 25.10.2019
Сообщений: 69
25.02.2020, 18:01  [ТС]
спасибо большое все работает
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.02.2020, 18:01
Помогаю со студенческими работами здесь

Как остановить все потоки, созданные в Parallel.ForEach
void ProcessQueue(string item) { Action&lt;string&gt; dgv =...

Остановить все потоки через определённое время
Создаю и запускаю несколько потоков в петле. Как сделать что бы все сразу остановились через определённое время? public void...

Как остановить потоки?
Хочу сделать такую задачу. Создать 36 потоков. Остановить каждый (wait() ). и затем по команде notifyAll(), одновремено разбудить все и тот...

Как остановить потоки
for (int i = 0; i &lt; StrToInt(Form1-&gt;sSpinEdit1-&gt;Text); i++) {//в Edit1 количество потоков _beginthreadex( NULL, 0, &amp;nobonob,(void *)0,...

Как остановить потоки в потоке?
У меня есть программа следующего вида: class Program { private static void Main() { Thread...


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

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

Новые блоги и статьи
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определенном условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru