gpt4 book ai didi

delphi - Delphi的BeginThread阻塞函数

转载 作者:行者123 更新时间:2023-12-02 08:16:30 33 4
gpt4 key购买 nike

如果在 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.

最佳答案

表达式Pointer(test) 调用 test(),然后将结果类型转换为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;

关于delphi - Delphi的BeginThread阻塞函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43239381/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com