找不到TThread.Queue过载

时间:2015-11-09 16:34:52

标签: delphi

这个简单的程序无法编译。 [用XE5和D10测试。]

program Project10;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.Classes;

function MakeProc: TThreadProcedure;
begin
  Result := procedure begin end;
end;

begin
  TThread.Queue(nil, MakeProc);
end.

编译器报告错误

  

[dcc32错误] Project10.dpr(16):E2250没有可以使用这些参数调用的'Queue'的重载版本

TThread.Queue电话中

TThread实现了两个Queue重载。

class procedure Queue(const AThread: TThread; AMethod: TThreadMethod); overload; static;
class procedure Queue(AThread: TThread; AThreadProc: TThreadProcedure); overload; static;

我很确定我的代码应该匹配第二次重载。

我能找到的唯一解决方法是:

TThread.Queue(nil, procedure begin MakeProc; end);

我做错了什么或这是编译器错误?有没有比我丑陋的黑客更好的解决方法?

2 个答案:

答案 0 :(得分:8)

编译器显然认为你试图将MakeProc本身作为参数传递。您可以通过添加括号来告诉编译器您打算调用该函数,就像函数接受参数一样:

TThread.Queue(nil, MakeProc());

您的解决方法似乎不起作用。它会编译并运行,但MakeProc返回的函数永远不会执行。相反,匿名方法包装 MakeProc将运行,调用MakeProc,然后丢弃该函数的结果。 (由于函数的结果在您提供的代码中没有做任何事情,您可能没有注意到差异。)

答案 1 :(得分:0)

TThread.Queue方法将匿名过程作为参数。您无法参考通常的程序来代替匿名程序。但是你可以调用重载的TThread.Queue方法,该方法将类方法引用作为参数。见下面的例子:

type
  TMyTestClass = class
  public
    procedure ThreadProc;
  end;

{ TMyTestClass }

procedure TMyTestClass.ThreadProc;
begin
  WriteLn('We are in thread');
end;

var
  MyTestClass: TMyTestClass;
begin
  with TMyTestClass.Create do
  try
    TThread.Queue(nil, ThreadProc);
  finally
    Free;
  end;
end.