如果在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)
表达式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)