Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как создавать потоки без класса TThread 2

Delphi , Компоненты и Классы , Потоки

Как создавать потоки без класса TThread 2


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

procedure printh(p: pointer); stdcall;
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure printh(p: pointer);
begin
  TForm1(p).caption := 'Hello from thread';
  ExitThread(0);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  h1: cardinal;
begin
  createthread(nil, 128, @printh, self, 0, h1);
end;

end.

Код, который вы предоставили, создает поток с помощью функции CreateThread API Windows, не используя класс TThread. Вот разбивка на части:

Декларация модуля Модуль декларирует форму (TForm1) с кнопкой (Button1) и две процедуры: printh (независимая процедура) и Button1Click (обработчик события клика по кнопке).

Процедура printh Это процедура, которая будет выполняться в новом потоке. Она принимает указатель (p) как аргумент, который кастится в экземпляр TForm1 и устанавливает его заголовок на "Hello from thread". Вызов ExitThread(0) прекращает поток.

Процедура Button1Click Это обработчик события клика по кнопке. Когда кнопка кликается, она создает новый поток с помощью функции CreateThread. Аргументы:

  • nil: необязательный аргумент для безопасности потока
  • 128: размер стека потока (в байтах)
  • @printh: адрес процедуры, которая будет выполняться в новом потоке
  • self: экземпляр TForm1, который владеет кнопкой
  • 0: необязательный аргумент для приоритета потока
  • h1: переменная для хранения идентификатора потока

Основной программный код Основной программный код создает экземпляр TForm1 и запускает приложение.

Обратите внимание, что этот код не проверяется на ошибки, поэтому вам может потребоваться добавить некоторые обработчики ошибок для обеспечения успешного создания потока. Кроме того, процедура printh предполагает, что переданный указатель является валидным экземпляром TForm1. Если это не так, код может вызвать ошибку или привести к неожиданным результатам.

В качестве альтернативных решений, если вы используете Delphi 2009 или более позднюю версию, можно использовать класс TThread, который предоставляет более удобный и безопасный способ создания и управления потоками. Вот пример:

type
  TMyThread = class(TThread)
  protected
    procedure Execute; override;
  end;

procedure TMyThread.Execute;
begin
  TForm1(self.Parent).Caption := 'Hello from thread';
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  TMyThread.Create(True).Start;
end;

В этом коде создается новый экземпляр TMyThread и запускается, без необходимости вручной создания потока с помощью CreateThread. Метод Execute переопределяется для установки заголовка формы.

В статье описывается способ создания потоков в Delphi без использования класса TThread, а именно через вызов функции CreateThread и передачу указателя на объект формы в процедуру, выполняемую в новом потоке.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Потоки ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-17 05:41:56/0.005742073059082/0