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

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

25.02.2020, 16:34. Показов 2165. Ответов 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
Модератор
4138 / 2352 / 809
Регистрация: 15.11.2015
Сообщений: 9,399
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
Модератор
4138 / 2352 / 809
Регистрация: 15.11.2015
Сообщений: 9,399
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
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru