gpt4 book ai didi

delphi - 向 CreateThread 传递参数

转载 作者:行者123 更新时间:2023-12-03 15:37:14 27 4
gpt4 key购买 nike

我在调用 CreateThread 时将类引用作为参数传递给 ThreadProc 时遇到问题。这是一个示例程序,演示了我遇到的问题:

program test;

{$APPTYPE CONSOLE}

uses
SysUtils, Windows, Dialogs;

type
TBlah = class
public
fe: Integer;
end;

function ThreadProc(param: Pointer) : DWORD;
begin
ShowMessage(IntToStr(TBlah(param).fe));

Result := 0;
end;

var
tID: DWORD;
handle: THandle;
b: TBlah;
begin
b := TBlah.Create;
b.fe := 54;

handle := CreateThread(nil, 0, @ThreadProc, Pointer(b), 0, tID);

WaitForSingleObject(handle, INFINITE);
end.

调用 ShowMessage 会弹出一个消息框,其中包含类似 245729105 的内容,而不是我期望的 54 内容。

这可能只是对 Delphi 工作原理的一个基本误解,所以有人可以告诉我如何让它正常工作吗?

最佳答案

这里的问题是你的线程函数有错误的调用约定。您需要使用 stdcall 约定来声明它:

function ThreadProc(param: Pointer) : DWORD; stdcall;

enter image description here

<小时/>

话虽如此,使用 TThread 后代来为您处理 OOP 到 C 函数返回 OOP 的转换会更惯用。看起来像这样:

type
TBlah = class(TThread)
protected
procedure Execute; override;
public
fe: Integer;
end;

procedure TBlah.Execute;
begin
ShowMessage(IntToStr(fe));
end;

var
b: TBlah;

begin
b := TBlah.Create(True);
b.fe := 42;
b.Start;
b.WaitFor;
end.

顺便问一下,有谁知道为什么 Windows.pas 将 TFNThreadStartRoutine 声明为 TFarProc 而不是正确类型化的函数指针?

关于delphi - 向 CreateThread 传递参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5110373/

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