BeginThread delphi阻塞函数

Ste*_*rup 2 delphi

如果在Delphi XE3中使用BeginThread,则该函数被阻止.这是为什么?

我试过在下面创建我的问题的最小版本.在可以按下2个按钮的情况下,如果按下按钮btn1,btn1的标题应该变为'nooo'.如果按btn2,则btn1标题更改为'yesss'.

当按下btn1时,我也使用始终循环的BeginThread启动一个线程.

问题是,btn1.Caption:='nooo'; 自BeginThread阻止以来永远不会受到限制.我到达了btn1.Caption:='nooo';

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    btn1: TButton;
    btn2: TButton;
    procedure btn1Click(Sender: TObject);
    procedure btn2Click(Sender: TObject);

  private
    function test() : Integer;
    { Private declarations }
  public

    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function TForm1.test() : Integer;
begin

    while True do
    begin
      Sleep(Random(1000) * 2);
    end;
    Result := 0;
end;

procedure TForm1.btn1Click(Sender: TObject);
var
  id: LongWord;
begin
  BeginThread(nil, 0, Pointer(test), nil, 0, id);
  btn1.Caption := 'nooo';
end;

procedure TForm1.btn2Click(Sender: TObject);
begin
   btn1.Caption := 'yesss';
end;

end.
Run Code Online (Sandbox Code Playgroud)

Rob*_*edy 7

表达式Pointer(test) 调用 test()然后将结果类型转换为a Pointer.由于test()永远不会返回,因此没有结果可以投射,因此没有值传递给BeginThread().BeginThread()本身不阻止; 它从来没有被调用过.

第三个参数BeginThread()不是类型Pointer; 它是类型TThreadFunc,它是一个独立的(非成员)函数,它接收一个Pointer参数并返回一个Integer.您的TForm1.test()方法不符合条件,因为它不是一个独立的功能.

制作test()一个独立的函数,然后直接传递给它BeginThread()(没有任何类型转换或@运算符):

function test(param: Pointer): Integer;
begin
  while True do
    Sleep(Random(1000) * 2);
  Result := 0;
end;

var
  id: LongWord;
begin
  BeginThread(nil, 0, test, nil, 0, id);
end;
Run Code Online (Sandbox Code Playgroud)

  • 否则,请使用`TThread`类,它在内部使用`BeginThread()`. (2认同)