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

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Korall
Новичок
Сообщения: 21
Зарегистрирован: 01 Сентябрь 2010, 13:45

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

Сообщение Korall »

Добрый день!

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

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

Сообщение 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) за этот промежуток времени.
Компьютер имеет то преимущество перед мозгом, что им пользуются...
Korall
Новичок
Сообщения: 21
Зарегистрирован: 01 Сентябрь 2010, 13:45

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

Сообщение Korall »

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

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

Спасибо еще раз!!
Ответить