15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


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

Компилятор: Delphi

Ниже приведены два примера, которые при создании потоков позволяют обойтись без класса TThread, используя API функции CreateThread, SuspendThread, ResumeThread и TerminateThread.

Пример 1:

Поместите на форму 2 окошка редактирования (edit) и 6 кнопок. Далее приведён сам код:
/---------------------------------------------------------------------------------------------------

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;

/--------------------------------------------------------------------------------------------------------

 

Пример 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.

/------------------------------------------------------------------------------------------------------