- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
由于我在使用 TWebBrowser 和 TEmbeddedWB 时不时收到“浮点除以零”异常,我发现我需要屏蔽除零异常 Set8087CW 或 SetMXCSR。
问题 1:执行此操作的最佳方法是什么:
OnBeforeNavigate
和OnDocumentComplete
屏蔽/取消屏蔽异常的事件? (文档加载后是否有可能出现异常?)问题 2:仅屏蔽“除以零”而不屏蔽其他内容的最佳“命令”是什么 - 如果应用程序是 32 位,是否还需要屏蔽 64 位异常?
我正在使用的应用程序始终具有可用于显示电子邮件内容的 TWebBrowser 控件。
此外,如果有人可以澄清 - 这是 Microsoft 的 TWebBrowser 控件的特定错误还是只是 Delphi/C++ Builder 和 Microsoft 工具之间的差异?如果我在 Visual C++ 应用程序中托管 TWebBrowser,如果出现被零除错误,会发生什么 - 它不会被转换为异常,但会发生什么 - Visual C++ 将如何处理“被零除”异常?
奇怪的是,微软这么长时间都没有注意到这个问题 - 同样奇怪的是,Embarcardero 也从未注意到它。因为屏蔽浮点异常还可以有效地屏蔽您自己的程序异常以用于该特定目的。
更新
经过一番研究,我的最终解决方案是:
SetExceptionMask(GetExceptionMask() << exZeroDivide);
GetExceptionMask() 的默认状态返回:TFPUExceptionMask() << exDenormalized << exUnderflow << exPrecision
。显然,一些异常已经被屏蔽了 - 这只是添加了 exZeroDivide
屏蔽异常。
因此,每次除以零现在都会产生浮点形式的 +INF,而不是异常。我可以接受这一点 - 对于代码的生产版本,它将被屏蔽以避免错误,而对于调试版本,它将被取消屏蔽以检测浮点除以零。
最佳答案
假设您不需要在应用程序代码中取消屏蔽浮点异常,那么最简单的做法无疑是在初始化代码中的某个时刻屏蔽异常。
最好的方法是这样:
SetExceptionMask(exAllArithmeticExceptions);
这将在 32 位目标上设置 8087 控制字,并在 64 位目标上设置 MXCSR。您将在 Math
单元中找到 SetExceptionMask
。
如果您希望在代码中隐藏浮点异常,那么事情就会变得棘手。一种策略是在专用线程中运行浮点代码,以揭露异常。这当然可以工作,但如果您依赖 RTL 函数 Set8087CW
和 SetMXCSR
,则不行。请注意,RTL 中控制 FP 单元的所有内容都通过这些函数进行路由。例如 SetExceptionMask
就是这样。
问题是 Set8087CW
和 SetMXCSR
不是线程安全的。似乎很难相信 Embarcadero 会如此无能,以至于生成在线程上下文上运行的基本例程,但又无法保证线程安全。但这就是他们所做的。
想要消除他们留下的困惑是非常困难的,而且要做到这一点需要大量的代码修补。缺乏线程安全性是由于(错误)使用了全局变量 Default8087CW
和 DefaultMXCSR
。如果两个线程同时调用 Set8087CW
或 SetMXCSR
,则这些全局变量可能会产生将值从一个线程泄漏到另一个线程的效果。
您可以将 Set8087CW
和 SetMXCSR
替换为不更改全局状态的版本,但遗憾的是事情没有那么简单。全局状态用于其他各个地方。这可能看起来不谦虚,但如果您想了解更多有关此事的信息,请阅读我的这份质量控制报告所附的文档:http://qc.embarcadero.com/wc/qcmain.aspx?d=107411
关于delphi - 使用 Set8087CW、SetMXCSR 和 TWebBrowser 屏蔽浮点异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19187479/
我正在尝试使用 HTML/CSS3 和 Javascript 重新创建经典手机游戏“贪吃蛇”。当我运行我在 chrome 中的内容时,我在第 41 行收到意外的标记错误。为什么分号是意外的?我目前的代
当我运行“perl -cw”来检查我的 perl 模块的语法并遇到警告或错误时,会给出两个行号: perl -cw lib/My/Module.pm Global symbol "%badvar" r
public class Menu extends Activity { /** Called when the activity is first created. */ public
假设我有一个多边形的顶点,它们都是逆时针方向的。我希望沿着这个多边形的边界生成 n 个等距点。有谁知道任何现有的软件包可以做到这一点,如果没有,可以使用一种算法吗?我在 Python 中工作。例如,如
我正在为 iOS 设备编写一些触摸输入代码,需要确定滑动的移动相对于屏幕中心是顺时针还是逆时针。 使用触摸的 position 和 deltaPosition,我可以使用点积计算从屏幕中心到这些点的向
如果发出编译警告,我希望 perl -cw ... 返回非零退出状态。 例如。假设 a.pm是文件: use warnings; asd; 然后perl -cw a.pm报告: Unquoted st
如何将RC中FPU位的控制字设置为3? 答案(编者注:不要将答案作为问题的一部分发布,但现在就在这里) fstcw word ptr cw or word ptr cw, 110000000000b
我有一个用例可以在 SLA 未命中时发出警报。我的应用程序在 startTime (M1) 和 endTime (M2) 上发出指标。如果我的工作完成,我将能够通过执行 (M2-M1) 之类的度量数学
我想将 CloudWatch 日志从各种 SAM 堆栈/lambda(可能转发到 Kinesis,然后)转发到 Graylog EC2 实例。重点是,我还想自动添加稍后部署的堆栈中的日志。 如何自动执
首先要感谢 CommonsWare 这个很棒的组件。但我有一个问题,有时让我感到悲伤。即 --> java.lang.IllegalStateException: 适配器的内容已更改但 ListVie
这就是我的 我在 2D X,Y 中有一个平面 我通过点击屏幕 X', Y' 来设置他的目的地 我计算它需要转向以面向此目的地的角度: // Calculate the angle between pl
我尝试了多种方法 - 三重引用和使用格式。但我似乎无法让程序在参数格式正确的情况下运行。该程序是一个自定义程序,我设法使用 os.system() 运行,但由于我需要更复杂的交互,因此需要使用 Pop
我正在尝试找到一种方法来检查 python 中的语法(以及警告),就像它在 perl 上所做的一样,例如:perl -cw filename.pl。 谢谢 最佳答案 您可能想要以下之一: PyChec
我正在研究一种算法,用于将 STL 文件切片为每个切片的单独 SVG 文件。我是我有一组线段的点,这些线段将在每个切片中组成一个或多个多边形(如果 STL 模型中有一个洞,将有几个多边形组成轮廓),我
这是a link我在 stackoverflow 中找到了关于这个问题的信息。 但如果没有具体的例子,我仍然无法理解“更改内部词”和“更改词”之间的区别。 我在vim中测试了这两个命令,最终没有发现任
我正在使用 CodeWarrior for MCU v10.6 IDE 开发一个项目。它是 NXP 的基于 Eclipse 的 IDE。该项目的目标是 NXP 的 K21 SoC(确切地说是 MK21
我正在使用 Dr.Java 来执行此构造函数。当我在交互框中输入以下内容时 CensoredWriter cw = new CensoredWriter(System.out, "whine|whin
我知道CW是顺时针,CCW是逆时针, 但我认为他们达到了同样的效果!他们两个都可以获得一个完整的Rect。path.addRect源码: private void addRect(float left
我找不到任何关于为什么添加到路径的闭合形状想要顺时针或逆时针以及闭合形状意味着什么的解释,比如说要将 CW 或 CCW 添加到路径的椭圆形, 最后你仍然会得到和椭圆形添加到路径? 最佳答案 这些值定义
我不知道这是不是一个太具体的问题,如果可能的话,但我必须将使用 CaSTLe Windsor 的应用程序移植到 Unity,这样就不会依赖非 Microsoft 批准的库.我知道我知道,但你打算做什么
我是一名优秀的程序员,十分优秀!