使用REPEAT阻止事件发生?

时间:2012-03-29 06:12:02

标签: progress-4gl

这是我的问题: 在START按钮的三分之一处,我想执行一个块。并且我应该停止执行 按STOP按钮。

例如 在开始按钮的三角形上:

REPEAT:
    message "hai".
END.

当我按下STOP按钮时它应该停止。我应该给REPEAT块什么附加条件?最好我不想在STOP按钮Triger中写条件。请给出建议。

3 个答案:

答案 0 :(得分:2)

进展不是多线程的。

因此,您必须仔细考虑需要在哪些上下文中执行哪些代码才能伪造它。 (比我最初的“无法做到的”回复更仔细。)

正如“firhang”指出“过程事件”可以用来检查排队等待准备好的事件。

因此,您可以在事件处理程序中运行循环,并让该事件处理程序侦听其他事件。

我相信以下内容满足原始问题,并且可以在GUI和角色客户端中使用:

define variable i as integer no-undo.

define variable bStop as logical no-undo.

define button butStart label "Start".
define button butStop  label "Stop".

form butStart butStop with frame but-frame row 1. 

on choose of butStop bStop = true.

on choose of butStart do:

  bStop = false.

  do while bStop = false:
    i = i + 1.
    process events.
    message i.
  end. 

  message "Paused".

end.

enable butStart butStop with frame but-frame.

pause 0 before-hide.

wait-for window-close of current-window.

答案 1 :(得分:1)

PROCESS EVENTS陈述 处理所有未完成的事件,而不会阻止用户输入。

语法

过程事件

实施例 在您选择STOP之前,此过程将计为1,000:

R-proevs.p

DEFINE VARIABLE ix       AS INTEGER NO-UNDO. 
DEFINE VARIABLE stop-sel AS LOGICAL NO-UNDO. 
DEFINE BUTTON stop-it LABEL "STOP". 
DISPLAY stop-it. 
ON CHOOSE OF stop-it 
   stop-sel = TRUE. 
ENABLE stop-it. 
DO ix = 1 TO 1000:   
  DISPLAY ix VIEW-AS TEXT. 
  PROCESS EVENTS. 
  IF stop-sel THEN LEAVE.  
END. 

在每次循环中,过程显示ix的新值,然后检查是否有任何事件等待处理。如果没有发生任何事件,则继续执行并循环迭代。如果选择了STOP按钮,则会处理该事件,从而更改stop-sel的值。执行继续时,程序退出循环。

如果循环不包含PROCESS EVENTS语句,则choose事件永远不会处理,循环将迭代,直到ix等于1,000。

注 WAIT-FOR语句处理所有挂起事件并阻止所有其他执行,直到发生指定事件。 PROCESS EVENTS语句处理所有挂起事件,并立即继续执行下一个语句。 如果存在已收到但尚未处理PROCEDURE-COMPLETE事件的任何异步请求,则此语句将按照WAIT-FOR语句的描述处理这些事件。 你不能在ABL中调用.NET方法system.Windows.Forms.Application:DoEvent()。 PROCESS EVENTS语句执行此方法的功能。 当此语句执行时,.NET可以在ABL会话的上下文中引发异常。

答案 2 :(得分:0)

DEFINE VARIABLE bStop AS LOGICAL NO-UNDO.

DEFINE BUTTON butStop LABEL "Stop".

FORM butStop WITH FRAME but-frame ROW 1. 

ON CHOOSE OF butStop bStop = TRUE.

ENABLE butStop WITH FRAME but-frame.

REPEAT:
  PROCESS EVENTS.
  MESSAGE "hai".
  IF bStop THEN LEAVE.
END. 

MESSAGE "stoped".

WAIT-FOR WINDOW-CLOSE OF CURRENT-WINDOW.