首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >找不到TThread.Queue过载

找不到TThread.Queue过载
EN

Stack Overflow用户
提问于 2015-11-09 16:34:51
回答 2查看 212关注 0票数 3

这个简单的程序不编译。用XE5和D10进行测试。

代码语言:javascript
复制
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重载。

代码语言:javascript
复制
class procedure Queue(const AThread: TThread; AMethod: TThreadMethod); overload; static;
class procedure Queue(AThread: TThread; AThreadProc: TThreadProcedure); overload; static;

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

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

代码语言:javascript
复制
TThread.Queue(nil, procedure begin MakeProc; end);

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-09 16:44:02

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

代码语言:javascript
复制
TThread.Queue(nil, MakeProc());

你的解决办法似乎行不通。它将编译和运行,但是MakeProc返回的函数永远不会执行。相反,包装MakeProc的匿名方法将运行、调用MakeProc,然后丢弃该函数的结果。(由于函数的结果在您提供的代码中没有执行任何操作,所以您可能没有注意到两者之间的区别。)

票数 8
EN

Stack Overflow用户

发布于 2015-11-09 17:01:44

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

代码语言:javascript
复制
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.
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33613798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档