Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi XE8在应用程序启动时优雅地处理etheringException_Delphi_Exception_Tethering_Delphi Xe8 - Fatal编程技术网

Delphi XE8在应用程序启动时优雅地处理etheringException

Delphi XE8在应用程序启动时优雅地处理etheringException,delphi,exception,tethering,delphi-xe8,Delphi,Exception,Tethering,Delphi Xe8,Delphi app tethering manager在2020-2039之间保留20个端口,用于启动其通信线程。 我想知道当第21个应用程序在同一台计算机上启动时会发生什么。事实证明,这个应用程序只是挂起不响应,直到它被杀死,我还没有找到一种方法来优雅地终止它 要复制,只需将一个TTetheringManager和一个TTetheringProfile放在一个空表单上,将概要文件连接到管理器,编译,在IDE外部启动应用程序20次,最后在IDE中启动第21个实例 这是我到目前为止发现的: 在S

Delphi app tethering manager在2020-2039之间保留20个端口,用于启动其通信线程。 我想知道当第21个应用程序在同一台计算机上启动时会发生什么。事实证明,这个应用程序只是挂起不响应,直到它被杀死,我还没有找到一种方法来优雅地终止它

要复制,只需将一个TTetheringManager和一个TTetheringProfile放在一个空表单上,将概要文件连接到管理器,编译,在IDE外部启动应用程序20次,最后在IDE中启动第21个实例

这是我到目前为止发现的:

在System.Tether.NetworkAdapter中:过程TTetheringNetworkManagerCommunicationThread.Execute; 无法启动TCP或UDP通信服务器时,将引发etheringException.Create(SManagerNetworkCreation)。到目前为止还不错

此异常显示在调试器中。当我继续并单步执行以下代码时,应用程序最终挂起在系统中:function AcquireExceptionObject且永不返回

由于应用程序是在application.Run期间引发的,因此我尝试通过以下方式捕获异常:

try
  Application.Run;
except
  ShowMessage('Something went terribly wrong!');
end;

但这不起作用。有没有关于如何捕获(或防止)此异常的建议?

因为这看起来确实是一个bug,我为此提交了一份质量报告:

您应该能够为应用程序的
OneException
事件添加事件处理程序并在那里处理异常。谢谢您的建议,但这也没有帮助。我尝试设置Application.OnException,但从未执行此事件处理程序。也可以通过在运行时将TetherManager分配给TetherProfile来触发异常,例如:
过程TForm1.FormShow(发送方:TObject);开始尝试TetheringAppProfile1。管理器:=TetheringManager;除了ShowMessage(“这里出了点问题:”);结束;最终显示消息(“最终成功”);结束;结束
Boy这看起来很难看:/except和finally都没有到达,应用程序只是挂起。我用madexcept运行了它,它显示/捕获异常。请看这里:希望这能让您了解发生了什么。再次思考调用堆栈之后,有两点需要注意:1)主线程被阻塞/等待WaitFor()中的信号,可能是为了唤醒某些信号,2)线程中发生的异常显然不会唤醒主线程,因此,这个异常从未被发现/处理,应用程序挂起等等。我觉得它闻起来像个bug。至少我希望在某个地方会有一些逻辑,以确保在发生致命异常时唤醒主线程,比如这里。