这个简单的程序不编译。用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 Error Project10.dpr(16):E2250没有可以用这些参数调用的“队列”重载版本
在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);是我做错什么了还是这是编译器的错误?有比我丑陋的黑客更好的解决办法吗?
发布于 2015-11-09 16:44:02
编译器显然认为您试图将MakeProc本身作为参数传递。您可以告诉编译器,您打算通过添加括号来调用该函数,就像函数使用参数时一样:
TThread.Queue(nil, MakeProc());你的解决办法似乎行不通。它将编译和运行,但是MakeProc返回的函数永远不会执行。相反,包装MakeProc的匿名方法将运行、调用MakeProc,然后丢弃该函数的结果。(由于函数的结果在您提供的代码中没有执行任何操作,所以您可能没有注意到两者之间的区别。)
发布于 2015-11-09 17:01:44
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.https://stackoverflow.com/questions/33613798
复制相似问题