1

这是我的问题:在触发 START 按钮时,我想执行一个块。当我按下停止按钮时它应该停止执行。

例如在启动按钮的触发器上:

REPEAT:
    message "hai".
END.

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

4

3 回答 3

2

进度不是多线程的。

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

正如“firhang”指出的那样,“PROCESS EVENTS”可用于检查排队并准备采取行动的事件。

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

我相信以下满足原始问题并在 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.
于 2012-03-29T22:16:55.760 回答
1

PROCESS EVENTS 语句 处理所有未完成的事件而不阻塞用户输入。

句法

过程事件

示例 此过程计数为 1,000,直到您选择 STOP:

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 语句,则选择事件永远不会处理并且循环迭代直到 ix 等于 1,000。

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

于 2012-04-14T15:06:23.117 回答
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.
于 2012-03-29T18:12:11.187 回答