Последние записи
- Взаимодействие через командную строку
- Перенести программу из Delphi в Lazarus
- Определить текущую ОС
- Автоматическая смена языка (раскладки клавиатуры)
- Сравнение языков на массивах. Часть 2
- wprintf как напечатать кириллицу
- Взаимодействие через командную строку
- Сравнение языков на массивах. Часть 1
- Сравнение языков по скорости
- Чтение огромных xml-файлов
Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk
Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - ttps://clck.ru/fCrQw
19th
Мар
Пример использования потока в форме
Posted by Chas under Delphi
Нужно, чтобы при нажатии на кнопку «Остановить» поток завершался и выполняемый скрипт останавливался.
unit frm_Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TFormMain = class(TForm)
BStart2: TButton;
BCheck2: TButton;
procedure BStart2Click(Sender: TObject);
procedure BCheck2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
TMyThread2 = class(TThread)
private
{ Private declarations }
i: Integer;
protected
procedure Execute; override;
procedure SyncProc;
public
end;
var
FormMain: TFormMain;
MyThread2: TMyThread2;
implementation
{$R *.dfm}
procedure TFormMain.BStart2Click(Sender: TObject);
begin
if BStart2.Tag = 0 then
begin
BStart2.Tag := 1;
BStart2.Caption := 'Стоп';
MyThread2 := TMyThread2.Create(True); // После создания поток остановлен
MyThread2.FreeOnTerminate := True; // После завершения работы поток "не умрёт" сам
MyThread2.Resume; // Запуск потока
end
else
begin
BStart2.Tag := 0;
BStart2.Caption := 'Старт';
// Поток не прекращает свою работу
// НЕ УБИВАЕТ поток, а просто выставляет свойство Terminated в True
// Поток сам должен следить (в теле Execute) за тем, когда должен умереть
// Жёстко уничтожить поток можно с помощью TerminateThread, но делать этого нельзя, потому как утечки памяти как минимум... ну и прочие неприятности
MyThread2.Terminate;
end;
end;
procedure TMyThread2.Execute;
var
i2: Integer;
begin
for i2 := 0 to 60 do
begin
if Self.Terminated then Exit; // Если главный поток приказал - умираем
if i2 > 61 then Break;
Sleep(100);
i := i2;
Synchronize(SyncProc);
end;
Terminate;
end;
procedure TMyThread2.SyncProc;
begin
FormMain.Caption := IntToStr(i);
end;
procedure TFormMain.BCheck2Click(Sender: TObject);
begin
// Проверка на существование потока
if MyThread2 <> nil then
begin
// Если поток умирает "мирно", штатно завершив работу
if MyThread2.Terminated then ShowMessage('Поток "MyThread2" не работает') else ShowMessage('Поток "MyThread2" работает');
end else ShowMessage('Поток "MyThread2" не создан');
end;
end.
Похожие статьи
Купить рекламу на сайте за 1000 руб
пишите сюда - alarforum@yandex.ru
Да и по любым другим вопросам пишите на почту
пеллетные котлы
Пеллетный котел Emtas
Наши форумы по программированию:
- Форум Web программирование (веб)
- Delphi форумы
- Форумы C (Си)
- Форум .NET Frameworks (точка нет фреймворки)
- Форум Java (джава)
- Форум низкоуровневое программирование
- Форум VBA (вба)
- Форум OpenGL
- Форум DirectX
- Форум CAD проектирование
- Форум по операционным системам
- Форум Software (Софт)
- Форум Hardware (Компьютерное железо)