TTask [n] EThreadNameException

时间:2015-12-22 12:46:40

标签: ios delphi delphi-10-seattle

专家,请参考以下代码段:

var
  aAllTasks : Array [0..1] of ITask  //global private var

Procedure SetImage();
begin

  //..      
  //.. Get a URL of an image stored on a server     
  //..

  aAllTasks[0] := TTask.Run(
    Procedure
    begin
      // Download the Image and display the image
    end);

  aAllTasks[1] := TTask.Run(
    Procedure
    begin
      // Get the rating of the image from a REST server
    end);

end;

调试器点击时

      aAllTasks[1] := TTask.Run(...);

我得到了

$ 001A30B5的首次机会异常。带有消息''的异常类EThreadNameException。处理APPNAME(126391)

它抛出异常,但它似乎没有崩溃App

这仅在调试/运行iOS应用时发生
iOS 9.2
RS 10 Seattle(更新1)
PA服务器17.0(带有修补程序.. V 8.0.1.52)
Xcode版本7.2(7C68)

导致这种情况的原因以及如何解决?

1 个答案:

答案 0 :(得分:3)

您的代码调用class procedure TThread.NameThreadForDebugging(AThreadName: string; AThreadID: TThreadID); {$IF Defined(MSWINDOWS)} .... // windows specific code removed {$ELSE MSWINDOWS} const cExceptionMessage = 'Type=$1000,Name=%s,ThreadID=%d,Flags=0'; EMBDBKPRESENTNAME = 'EMB_DBK_PRESENT'; {$IF Defined(MACOS)} OLDEMBDBKPRESENTNAME = 'EMB_MACOSX_DBK_PRESENT'; {$ENDIF} begin {$IF Defined(MACOS)} if (getenv(EMBDBKPRESENTNAME) <> nil) or (getenv(OLDEMBDBKPRESENTNAME) <> nil) then {$ELSEIF Defined(ANDROID)} if (System.DebugHook <> 0) or (getenv(EMBDBKPRESENTNAME) <> nil) then {$ELSE} if (getenv(EMBDBKPRESENTNAME) <> nil) then {$ENDIF} begin try raise EThreadNameException.Create( Format(cExceptionMessage, [AThreadName, AThreadID])); except end; end; end; {$ENDIF !MSWINDOWS} 。看起来像这样:

for weight_dict in d_weights
    for key in d_ids: 
        print weight_dict.get(key, "")

当您希望为线程命名时,将调用此函数。现在,线程对象没有名称。因此,当您为线程命名时,它仅用于调试目的。调试器会跟踪您提供的名称,并将它们与线程ID相关联。然后,当调试器显示有关线程的信息时,它可以从ID中查找名称并将其呈现给您。但这纯粹是一种调试器机制,因为操作系统不支持线程名称。

那么,您如何向调试器发出信号,表示您希望为线程命名。好吧,你抛出一个特定的例外。调试器知道异常并获得处理异常的第一次机会。调试器在异常文本中接收名称和线程ID,并记下该信息。

请注意,会立即吞下该异常,因此不会中断程序的流程。

因此,引发此异常是正常的,由调试器处理,而不是影响程序的行为。奇怪的是,调试器正在破坏该异常。我希望默认情况下调试器会忽略该异常。

OSX的旧QC报告(QC#105310)描述了您正在观察的行为。该问题已关闭,并在XE7中标记为已修复。也许这个问题已经重新出现,或者可能从未针对移动平台进行修复。我建议您向Quality Portal提交错误报告。