TTask[n] EThreadNameException
TTask[n] EThreadNameException
专家们,请看下面的代码片段:
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 的第一次机会异常。异常 class EThreadNameException,消息为“”。进程 APPNAME (126391)
它抛出异常但它似乎没有使应用程序崩溃
这仅在 debugging/running iOS 个应用程序时发生
iOS 9.2
RS 10 西雅图(更新 1)
PA 服务器 17.0(带有修补程序..V 8.0.1.52)
Xcode 版本 7.2 (7C68)
什么会导致这种情况,我该如何解决?
您的代码调用 TThread.NameThreadForDebugging
。看起来像这样:
class procedure TThread.NameThreadForDebugging(AThreadName: string; AThreadID: TThreadID);
{$IF Defined(MSWINDOWS)}
.... // windows specific code removed
{$ELSE MSWINDOWS}
const
cExceptionMessage = 'Type=00,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}
当您希望为线程命名时调用此函数。现在,线程对象没有名称。因此,当您为线程命名时,它仅用于调试目的。调试器会跟踪您提供的名称,并将它们与线程 ID 相关联。然后,当调试器显示有关线程的信息时,它可以从 ID 中查找名称并将其显示给您。但这纯粹是一种调试器机制,因为操作系统不支持线程名称。
那么,您如何向调试器发出您希望为线程命名的信号。好吧,你抛出一个特定的异常。调试器知道异常并获得第一个处理异常的机会。调试器收到异常文本中的名称和线程 ID,并记下该信息。
请注意,异常会立即被吞噬,因此不会中断程序的运行。
所以,这个异常被抛出,由调试器处理,是正常的,不会影响程序的行为。奇怪的是调试器中断了那个异常。默认情况下,我希望调试器忽略该异常。
OSX 的旧 QC 报告 (QC#105310) 准确描述了您观察到的行为。该问题已关闭并标记为已在 XE7 中修复。也许这个问题已经重新浮出水面,或者它可能从未针对移动平台得到解决。我建议您向 Quality Portal 提交错误报告。
专家们,请看下面的代码片段:
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 的第一次机会异常。异常 class EThreadNameException,消息为“”。进程 APPNAME (126391)
它抛出异常但它似乎没有使应用程序崩溃
这仅在 debugging/running iOS 个应用程序时发生
iOS 9.2
RS 10 西雅图(更新 1)
PA 服务器 17.0(带有修补程序..V 8.0.1.52)
Xcode 版本 7.2 (7C68)
什么会导致这种情况,我该如何解决?
您的代码调用 TThread.NameThreadForDebugging
。看起来像这样:
class procedure TThread.NameThreadForDebugging(AThreadName: string; AThreadID: TThreadID);
{$IF Defined(MSWINDOWS)}
.... // windows specific code removed
{$ELSE MSWINDOWS}
const
cExceptionMessage = 'Type=00,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}
当您希望为线程命名时调用此函数。现在,线程对象没有名称。因此,当您为线程命名时,它仅用于调试目的。调试器会跟踪您提供的名称,并将它们与线程 ID 相关联。然后,当调试器显示有关线程的信息时,它可以从 ID 中查找名称并将其显示给您。但这纯粹是一种调试器机制,因为操作系统不支持线程名称。
那么,您如何向调试器发出您希望为线程命名的信号。好吧,你抛出一个特定的异常。调试器知道异常并获得第一个处理异常的机会。调试器收到异常文本中的名称和线程 ID,并记下该信息。
请注意,异常会立即被吞噬,因此不会中断程序的运行。
所以,这个异常被抛出,由调试器处理,是正常的,不会影响程序的行为。奇怪的是调试器中断了那个异常。默认情况下,我希望调试器忽略该异常。
OSX 的旧 QC 报告 (QC#105310) 准确描述了您观察到的行为。该问题已关闭并标记为已在 XE7 中修复。也许这个问题已经重新浮出水面,或者它可能从未针对移动平台得到解决。我建议您向 Quality Portal 提交错误报告。