将参数传递给CreateThread

Kok*_*tsu 3 delphi parameter-passing delphi-2010 createthread

我在调用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.
Run Code Online (Sandbox Code Playgroud)

调用ShowMessage弹出一个消息框,里面有类似的东西245729105,54不像我期望的那样.

这可能只是对Delphi如何工作的基本误解,所以有人可以告诉我如何使其正常工作吗?

Dav*_*nan 10

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

function ThreadProc(param: Pointer) : DWORD; stdcall;
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


话虽如此,仅仅使用一个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.
Run Code Online (Sandbox Code Playgroud)

顺便说一下,有谁知道为什么Windows.pas声明TFNThreadStartRoutineTFarProc而不是一个正确的类型函数指针?

  • `b.fe:= 42;`,不要忘记`:`:) (3认同)
  • @Kokonotsu没有使用`TThread`的任何特殊原因?至于`=`vs`:=`,猜猜我今天做了太多P/Invoke! (2认同)

Ser*_*yuz 9

你忘记了这个stdcall指令.

function ThreadProc(param: Pointer) : DWORD; stdcall;
Run Code Online (Sandbox Code Playgroud)