Страница 1 из 1

Как на время блокировать ВСЕ действия Юзера?

Добавлено: 02 Ноябрь 2010, 21:40
Korall
Добрый день!

Ситуация следующая: в окне Юзер запустил расчет, в большом цикле что-то считается (минуты...), курсор на время работы цикла сделал: setCursor(Cursor:Wait), но если юзер ткнет куда-нибудь в кнопку, весь экран становится белесым и программа виснет. Кларион 5.5, шаблоны Синявского (не АБС), хочу сделать что-то перед запуском цикла, чтобы ЛЮБЫЕ нажатия клавиш и мыши вообще программой не воспринимались, а после окончания расчета опять все обрабатывалось.
Что мне сделать?

Re: Как на время блокировать ВСЕ действия Юзера?

Добавлено: 02 Ноябрь 2010, 23:33
WadimZapara
А может, не стоит блокировать юзверя ?
А вместо этого:
1) в каждой итерации цикла делать YIELD
2) периодически делать DISPLAY(?Progress), DISPLAY(?Counter)
3) пореже периодически делать DISPLAY
- и никакого "белёсого экрана" и "зависания" :wink:

ЗЫ:
1) Блокировка клавиш и мыши только в программе - не поможет (после переключения на другую задачу - будет то же самое).
2) Блокировать клаву и мышь на всём компе более сложно, а главное - совсем неправильно.

ЗЫ2:
А может, просто стоит переписать алгоритм цикла по типу:

Код: Выделить всё

  ACCEPT
    CASE EVENT()
    OF EVENT:ACCEPT
      Case Accepted()
      Of ?ЗапускПроцесса
        ПризнакЗапущенностиПроцесса = TRUE
        Win{PROP:TIMER} = 50
        Win{PROP:CURSOR} = CURSOR:Wait
        DISABLE(?ПервыйКонтрол, ?ПоследнийКонтрол)
!...
      End
    OF EVENT:Timer
      Loop 100 Times
         if УсловиеЗавершения then
           Win{PROP:TIMER} = 0
           Win{PROP:CURSOR} = CURSOR:Arrow
           ENABLE(?ПервыйКонтрол, ?ПоследнийКонтрол)
           ПризнакЗапущенностиПроцесса = FALSE
           Break
         end !if
         ! здесь действия в итерации цикла, в том числе, обновление ?Progress, ?Counter
!...
      End !Loop
!...
    OF EVENT:CloseWindow
      If ПризнакЗапущенностиПроцесса Then Cycle.
    END !CASE
  END !ACCEPT
- И никаких проблем :wink:
(контролы во время процесса блокированы,
на события окна, системы - реагирует, переключайся куда и когда хочешь,
закрыть окно по крестику и Alt-F4 невозможно)
Единственное - оптимально подобрать значения для таймера (здесь 50 в секунду) и числа итераций цикла (здесь 100) за этот промежуток времени.

Re: Как на время блокировать ВСЕ действия Юзера?

Добавлено: 03 Ноябрь 2010, 12:45
Korall
Спасибо! Оператором yield я баловался, но что получается: во время расчета юзер жмет от скуки в разные пункты меню, так как все подтормаживает, жмет по много раз, а затем, после окончания расчета, эти все нажатия начинают отрабатываться, вдруг открывается куча окон, что-то запускается, и юзер не знает, где он теперь находится. Видимо выход вообще все меню сделать disable на время расчета.

А про второй вариант я пока не очень понял, буду help долбить.

Спасибо еще раз!!