使用计时器事件时,会导致PowerBuilder应用程序崩溃。应用程序以随机的时间间隔崩溃。有时候崩溃不会超过一分钟,有时甚至不会出现崩溃,甚至是通过随机单击鼠标,编辑更改和项目更改来击中。
我想不出我可以做的任何检查崩溃原因的测试。我不知道在哪里放置TRY CATCH,因为代码非常非常简单。可疑的是,我打开的窗口实例在其Open事件中设置了计时器,仅当同时打开2个实例时,应用程序才会崩溃。
计时器触发一个自定义事件,并且该自定义事件具有对DataWindow的一行Retrieve函数调用。
数据窗口的检索到的事件令人怀疑的是消息框,它仅显示一条消息,指出“数据已刷新”。
1 -Open事件将计时器设置为10秒
2 -计时器事件调用dw_1.Retrieve()
3 -RetrieveEnd事件显示MessageBox
是计时器事件还是其他导致崩溃的事件?
答案 0 :(得分:0)
首先,the basics。
在您的描述中触发我的一件事是消息框。 MessageBox()将阻止消息队列的处理,而Timer功能将继续将多个Timer事件加载到队列中。如果我离开计算机10分钟,我无法想象要在所有Timer事件排队时此列表快速连续刷新60次。此外,取决于PB何时开始处理更多消息(我不清楚在Retrieve()期间是否处理了消息),您可能同时对同一事件进行多次处理,甚至更糟的是,在同一DataWindow上同时检索。
如果是我,我会:
祝你好运。
答案 1 :(得分:0)
通过以下更改解决的问题
1-以非模式方式显示我的消息##。
这非常重要,因为依赖计时器的进程无法负担 MessageBox ()。取而代之的是使用一个窗口,该窗口会在4秒后关闭。
2-防止同时发生多个计时器事件
两个事件很好 RetrieveStart 和 RetrieveEnd 。在此阶段,检索过程花费的时间不超过一秒钟,但是如果计时器事件没有在 RetrieveStart 处停止,以后再增加数据将引发问题。
3-使用标志防止同时发生多个计时器事件
这增加了代码和调试的复杂性。除了拥有两个单独的窗口,而不使用同一窗口的实例之外,没有其他方法。基本上一个供管理员使用,其他供所有其他用户使用。这是可能的,因为两个用户(非管理员)无权互相更改数据。管理员正在共享同一窗口,因此将他分开以使其Timer事件在他的区域中运行。
4-错误地根本不需要在计时器进程中运行的其他功能。
谢谢。