这个简单的程序无法编译。 [用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);
我做错了什么或这是编译器错误?有没有比我丑陋的黑客更好的解决方法?
答案 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.