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

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

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

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


unit Unit1;

interface

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

procedure incedit1; stdcall;
procedure incedit2; stdcall;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Button6: TButton;
    Button7: TButton;
    Button2: TButton;
    Button3: TButton;
    Button5: TButton;
    Button4: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

var
  th1, th2: cardinal;
  h1, h2: integer;

procedure incedit1;
var
  i: integer;
begin
  i := 0;
  while true do
  begin
    form1.edit1.text := inttostr(i);
    i := i + 1;
  end;
end;

procedure incedit2;
var
  i: integer;
begin
  i := 0;
  while true do
  begin
    form1.edit2.text := inttostr(i);
    i := i + 1;
  end;
end;
{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
  h1 := beginthread(nil, 1024, @incedit1, nil, 0, th1);
  h2 := beginthread(nil, 1024, @incedit2, nil, 0, th2);
end;

procedure TForm1.Button6Click(Sender: TObject);
begin
  terminatethread(h1, 0);
end;

procedure TForm1.Button7Click(Sender: TObject);
begin
  terminatethread(h2, 0);
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  resumethread(h1);
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
  resumethread(h2);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  suspendthread(h1);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  suspendthread(h2);
end;

end.

Перевод:

Код, который вы предоставили, создает два потока с помощью функции beginthread, которая является частью Windows API. Функция beginthread создает новый поток и запускает его, выполняя указанную процедуру (incedit1 или incedit2).

Однако, пожалуйста, обратите внимание, что beginthread устарел в Delphi 2009 и более поздних версиях. Вместо этого вы должны использовать метод TThread.Create, чтобы создавать потоки.

Вот обновленная версия вашего кода с использованием TThread:

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Button6: TButton;
    Button7: TButton;
    Button2: TButton;
    Button3: TButton;
    Button5: TButton;
    Button4: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  th1, th2: TThread;

implementation

procedure incedit1;
begin
  while not Terminated do
  begin
    Form1.Edit1.Text := IntToStr(0);
    Sleep(1000); // pause for 1 second
  end;
end;

procedure incedit2;
begin
  while not Terminated do
  begin
    Form1.Edit2.Text := IntToStr(0);
    Sleep(1000); // pause for 1 second
  end;
end;

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
  th1 := TThread.Create(True, @incedit1, nil);
  th2 := TThread.Create(True, @incedit2, nil);
end;

procedure TForm1.Button6Click(Sender: TObject);
begin
  th1.Terminate;
end;

procedure TForm1.Button7Click(Sender: TObject);
begin
  th2.Terminate;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  th1.Resume;
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
  th2.Resume;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  th1.Suspend;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  th2.Suspend;
end;

end.

В обновленном коде я заменил beginthread на TThread.Create, и использовал цикл while not Terminated do для того, чтобы потоки продолжали выполняться, пока они не будут остановлены. Я также удалил переменные h1 и h2, которые больше не были необходимы.

Кроме того, я добавил Sleep(1000) в процедурах incedit1 и incedit2 для паузы на 1 секунду между обновлениями контролов редактирования. Вы можете изменить это значение, чтобы оно соответствовало вашим потребностям.

Наконец, я заменил функции ResumeThread, SuspendThread и TerminateThread на соответствующие методы класса TThread (th1.Resume, th2.Resume, th1.Terminate и т.д.).

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


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

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




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


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


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-07-14 23:26:57/0.006486177444458/0