Используя REPEAT блок, пока не произойдет событие? - PullRequest
1 голос
/ 29 марта 2012

Это моя проблема: при срабатывании кнопки СТАРТ я хочу выполнить один блок.И он должен прекратить выполнение, когда я нажимаю кнопку СТОП.

Например, при срабатывании кнопки пуска:

REPEAT:
    message "hai".
END.

и когда я нажимаю кнопку СТОП, он должен остановиться.Какие дополнительные условия я должен дать блоку REPEAT? Желательно, чтобы я не хотел записывать условие в кнопку STOP Triger ... Пожалуйста, дайте предложение.

Ответы [ 3 ]

2 голосов
/ 30 марта 2012

Прогресс не многопоточный.

Таким образом, вы должны тщательно продумать, какие биты кода должны выполняться в каком контексте, чтобы имитировать его. (Более тщательно, чем мой первоначальный ответ «это невозможно сделать».)

Как указывает "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 голос
/ 14 апреля 2012

ПРОЦЕСС СОБЫТИЙ Обрабатывает все ожидающие события без блокировки для пользовательского ввода.

Синтаксис

ПРОЦЕСС СОБЫТИЙ

Пример Эта процедура считается до 1000, пока вы не выберете STOP:

г-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 не достигнет 1000.

Примечания Оператор WAIT-FOR обрабатывает все ожидающие события и блокирует все остальные операции, пока не произойдет указанное событие. Оператор PROCESS EVENTS обрабатывает все ожидающие события и немедленно продолжает выполнение со следующим оператором. Если есть какие-либо асинхронные запросы, для которых события PROCEDURE-COMPLETE были получены, но еще не обработаны, этот оператор обрабатывает эти события, как описано для оператора WAIT-FOR. Вы не можете вызвать метод .NET system.Windows.Forms.Application: DoEvent () в ABL. Оператор PROCESS EVENTS выполняет функцию этого метода. .NET может вызывать исключения в контексте сеанса ABL при выполнении этого оператора.

0 голосов
/ 29 марта 2012
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.
...