是Timer事件导致PowerBuilder应用崩溃?

时间:2019-07-12 07:29:57

标签: powerbuilder

使用计时器事件时,会导致PowerBuilder应用程序崩溃。应用程序以随机​​的时间间隔崩溃。有时候崩溃不会超过一分钟,有时甚至不会出现崩溃,甚至是通过随机单击鼠标,编辑更改和项目更改来击中。

我想不出我可以做的任何检查崩溃原因的测试。我不知道在哪里放置TRY CATCH,因为代码非常非常简单。可疑的是,我打开的窗口实例在其Open事件中设置了计时器,仅当同时打开2个实例时,应用程序才会崩溃。

计时器触发一个自定义事件,并且该自定义事件具有对DataWindow的一行Retrieve函数调用。

数据窗口的检索到的事件令人怀疑的是消息框,它仅显示一条消息,指出“数据已刷新”。

1 -Open事件将计时器设置为10秒

2 -计时器事件调用dw_1.Retrieve()

3 -RetrieveEnd事件显示MessageBox

enter image description here

是计时器事件还是其他导致崩溃的事件?

2 个答案:

答案 0 :(得分:0)

首先,the basics

在您的描述中触发我的一件事是消息框。 MessageBox()将阻止消息队列的处理,而Timer功能将继续将多个Timer事件加载到队列中。如果我离开计算机10分钟,我无法想象要在所有Timer事件排队时此列表快速连续刷新60次。此外,取决于PB何时开始处理更多消息(我不清楚在Retrieve()期间是否处理了消息),您可能同时对同一事件进行多次处理,甚至更糟的是,在同一DataWindow上同时检索。

如果是我,我会:

  1. 以非模式方式显示我的消息(例如,窗口上的一段静态文本)。
  2. 通过在计时器功能开始时关闭计时器并在最后将其重新打开来防止多个同时发生的计时器事件。
  3. 通过使用实例或共享标志来防止多个同时的Timer事件,具体取决于我希望如何处理窗口的多个实例。

祝你好运。

答案 1 :(得分:0)

通过以下更改解决的问题

  

1-以非模式方式显示我的消息##。

这非常重要,因为依赖计时器的进程无法负担 MessageBox ()。取而代之的是使用一个窗口,该窗口会在4秒后关闭。

  

2-防止同时发生多个计时器事件

两个事件很好 RetrieveStart RetrieveEnd 。在此阶段,检索过程花费的时间不超过一秒钟,但是如果计时器事件没有在 RetrieveStart 处停止,以后再增加数据将引发问题。

  

3-使用标志防止同时发生多个计时器事件

这增加了代码和调试的复杂性。除了拥有两个单独的窗口,而不使用同一窗口的实例之外,没有其他方法。基本上一个供管理员使用,其他供所有其他用户使用。这是可能的,因为两个用户(非管理员)无权互相更改数据。管理员正在共享同一窗口,因此将他分开以使其Timer事件在他的区域中运行。

4-错误地根本不需要在计时器进程中运行的其他功能。

谢谢。