我们有一个带有Oracle 11g后端的传统PowerBuilder 12.1 Classic应用程序,并且在生产中遇到了我们无法在测试环境中重现的性能问题。
有问题的窗口共享了grid / freeform DataWindows和按钮,用于打开其他响应窗口,这些窗口在关闭时会导致网格重新检索。
网格背后有一个非常昂贵的查询,有几列从函数调用中接收它们的值,其中包含一些非常强烈的SQL,但它仍然在几秒钟内运行,即使在生产中也是如此。
错误发生时唯一的一致性是,如果他们尝试快速导航到其他窗口,似乎更有可能。打开所述窗口的按钮假设某个实例变量设置为网格中焦点行中的适当值。但是,在这种情况下,尚未设置实例变量,即使它看起来已发生行焦点更改。这导致了无法实现的空引用异常。
最终用户的网络连接通常很迟钝,而且他们的硬件能力不比我们的要低。我想责怪网络,但我试图通过故意减慢SQL来自己在开发中重现这一点,以便我可以尝试点击按钮,但是一切都按照我的预期发生:点击按钮直到检索后才发生所有其他活动结束。
我的直觉告诉我,由于某种原因,事情并没有同步运行,而我能想象的唯一因素是SQL的速度,无论是查询速度慢,还是网络速度慢,但是我尝试再现那种效果仍然以正确的顺序发生的事情。唯一可疑的代码是数据窗口祖先从ue_post_rfc
发布一个名为rowfocuschanged
的用户事件,此事件执行Yield()
。 ue_post_rfc
是代码而不是rowfocuschanged
的地方。
是否有任何方式Yield()
会导致这些问题,而不会在测试环境中表现出来,即使人为地减慢了SQL?
答案 0 :(得分:1)
虽然您的消息可能无法提供足够的信息来为您提供解决问题的方法,但它确实为我提供了一个暗示我常常在PowerBuilder系统中看到的难以诊断的常见故障点。
开发事件的顺序是这样的
我建议摆脱这个问题(如果这是你的问题)是:
特里
P.S。这里有一些你问题引用的引号让我想起了Yield()(并不是说我不喜欢跳过全部收益率() grin )
错误发生时唯一的一致性就是它似乎是 如果他们试图快速导航到其他窗口,则更有可能。
当用户尝试非常快速地启动(比如说)两个动作时看到这一点。如果第一个操作中的脚本包含Yield(),则第二个操作中的脚本将在第一个操作完成之前开始和结束。对于用户操作的任何组合(例如按钮单击,菜单单击,选项卡,窗口关闭......),您可以在Yield()完成后再次显示窗口的可能性,这可能是正确的,对吗?如果没有加入那些代码为Yield(),没有,并且危险地生活的99%和系统事件(例如GetFocus,Deactivate,Timer)
你是对的。 PowerBuilder(除非你强制它)同步运行。但是,如果一个事件在另一个事件结束之前开始(参见上文),那么您将获得看起来的行为,就像异步行为一样。我的直觉告诉我,由于某种原因,事情并没有发生 同时他们应该
你所说的内容没有任何确定性,但你确实询问Yield()。如果你可以用PBDEBUG追踪重现这个问题,那么确定这个问题真的很有意义。你会看到哪些事件让你感到惊讶。但是,PBDEBUG减慢速度会影响事件序列和排队,这可能会有所帮助,也可能没有帮助。