Delphi AsyncCalls-主线程中64位以下的执行方法

Delphi AsyncCalls-主线程中64位以下的执行方法,delphi,asynchronous,64-bit,Delphi,Asynchronous,64 Bit,我现在在AsyncCalls库中遇到一些问题。我的代码片段应该在主线程中的方法中执行 procedure MustExecInMainThread(out Result: ISuperObject); // Sorry, the parameter cannot be changed var SwitchThread: Boolean; begin SwitchThread := Windows.GetCurrentThreadId <> MainThreadID;

我现在在AsyncCalls库中遇到一些问题。我的代码片段应该在主线程中的方法中执行

procedure MustExecInMainThread(out Result: ISuperObject); // Sorry, the parameter cannot be changed
var
  SwitchThread: Boolean;
begin   
  SwitchThread := Windows.GetCurrentThreadId <> MainThreadID;
  if SwitchThread then
    EnterMainThread;
  try
    ExecAndReturnResultsAsOutParam(Result);
  finally
    if SwitchThread then
      LeaveMainThread;
  end;
end;

有什么想法吗?

EnterMainThread/LeaveMainThread不再支持更新的Delphi版本

为了在主线程中完成过程的执行,请执行以下操作:

procedure MustExecInMainThread(out Result: ISuperObject); // Sorry, the parameter cannot be changed
var
  SwitchThread: Boolean;
  ResultTemp: ISuperObject;
begin   
  SwitchThread := Windows.GetCurrentThreadId <> MainThreadID;
  if SwitchThread then begin
    TThread.Synchronize(nil,
      procedure
      begin
        ExecAndReturnResultsAsOutParam(ResultTemp);
      end
    )
    Result := ResultTemp;
  end
  else  
    ExecAndReturnResultsAsOutParam(Result);
end;
过程MustExecInMainThread(输出结果:ISuperObject);//抱歉,无法更改参数
变量
SwitchThread:布尔型;
ResultTemp:ISuperObject;
开始
SwitchThread:=Windows.GetCurrentThreadId mainthrreadId;
如果切换线程,则开始
TThread.Synchronize(nil,
程序
开始
execandreturnresultsautparam(ResultTemp);
终止
)
结果:=ResultTemp;
终止
其他的
执行并返回结果SoutParam(结果);
终止

对于较新的Delphi版本,不再支持EnterMainThread/LeaveMainThread

为了在主线程中完成过程的执行,请执行以下操作:

procedure MustExecInMainThread(out Result: ISuperObject); // Sorry, the parameter cannot be changed
var
  SwitchThread: Boolean;
  ResultTemp: ISuperObject;
begin   
  SwitchThread := Windows.GetCurrentThreadId <> MainThreadID;
  if SwitchThread then begin
    TThread.Synchronize(nil,
      procedure
      begin
        ExecAndReturnResultsAsOutParam(ResultTemp);
      end
    )
    Result := ResultTemp;
  end
  else  
    ExecAndReturnResultsAsOutParam(Result);
end;
过程MustExecInMainThread(输出结果:ISuperObject);//抱歉,无法更改参数
变量
SwitchThread:布尔型;
ResultTemp:ISuperObject;
开始
SwitchThread:=Windows.GetCurrentThreadId mainthrreadId;
如果切换线程,则开始
TThread.Synchronize(nil,
程序
开始
execandreturnresultsautparam(ResultTemp);
终止
)
结果:=ResultTemp;
终止
其他的
执行并返回结果SoutParam(结果);
终止

将应用程序迁移到64位后,我仍在使用异步调用。我使用异步线程中的localvclall来更新主窗体上的进度条,该进度条在64位下不再受支持。 我很高兴发现TAsyncCalls.VCLInvoke也会做这件事。我只是打电话

 TAsyncCalls.VCLInvoke(
    procedure
    begin
      DoVCLStuffHere
    end)

与32位时代相比,我没有发现64位下有任何(更多)问题。

在将应用程序迁移到64位后,我仍在使用异步调用。我使用异步线程中的localvclall来更新主窗体上的进度条,该进度条在64位下不再受支持。 我很高兴发现TAsyncCalls.VCLInvoke也会做这件事。我只是打电话

 TAsyncCalls.VCLInvoke(
    procedure
    begin
      DoVCLStuffHere
    end)

与32位时代相比,我没有注意到64位下存在任何(更多)问题。

Asnyc调用使用了大量32位特定的硬核asm。它肯定不支持64位。因此,最明显的结论是64位的端口已断开。因为你没有透露你工作的那一部分,所以没有太多机会有人给你详细的信息。更重要的是,我怀疑64位的端口可能很难实现,因为x64上的ABI差异很大。我认为在x64下运行异步调用的目标注定要失败。请改用OTL。Asynccalls 2.99支持64位。{版本:2.98(2011-10-22)}{已添加:对Delphi XE2 64位的支持Andreas提到较新的Delphi版本不再支持EnterMainThread/LeaveMainThread。在阅读了“LU RD”的响应后,您想知道为什么要使用
AsyncCalls
来实现同步调用。@DavidHeffernan,我认为TThread已经满足了我的要求。Asnyc调用使用了大量32位特定的硬核asm。它肯定不支持64位。因此,最明显的结论是64位端口已断开。由于您没有透露这部分工作,因此没有太多机会有人向您提供有关它的详细信息。此外,我怀疑t由于x64上的ABI差异很大,64位端口可能难以实现。我认为您在x64下运行异步调用的目标注定会失败。请改用OTL。AsyncCalls 2.99支持64位。{Version:2.98(2011-10-22)}{已添加:对Delphi XE2 64位的支持Andreas提到较新的Delphi版本不再支持EnterMainThread/LeaveMainThread。在阅读了“LU RD”的响应后,您想知道为什么要使用
AsyncCalls
来实现同步调用。@DavidHeffernan,我认为TThread已经满足了我的要求。是否有必要对TThread进行SwitchThread测试。Syncrhonize?不能从主线程调用。
警告:不要从主线程内调用Synchronize。这可能会导致无限循环。
因此,在调用之前必须进行检查。我认为警告是针对非静态synchronic的nize方法。我已经仔细检查了源代码,静态方法TThread.Synchronize将以不同的方式处理代码,如果当前线程是主线程还是非主线程。在这种情况下,我将遵循文档中的建议。在这里安全操作不会导致任何性能损失。是否有必要对TThread.Synchronize执行SwitchThread测试?不能从主线程调用。
警告:不要从主线程内调用Synchronize。这可能会导致无限循环。
因此,是的,您必须在调用之前进行检查。我认为警告是针对非静态同步方法的。我已经仔细检查了源代码,静态方法TThread。Synchronize将处理代码di不同的是,如果当前线程是主线程还是非主线程。在这种情况下,我将遵循文档中的建议。在这里安全操作不会导致任何性能下降。