Страница 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
- и никакого "белёсого экрана" и "зависания"
ЗЫ:
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
- И никаких проблем

(контролы во время процесса блокированы,
на события окна, системы - реагирует, переключайся куда и когда хочешь,
закрыть окно по крестику и Alt-F4 невозможно)
Единственное - оптимально подобрать значения для таймера (здесь 50 в секунду) и числа итераций цикла (здесь 100) за этот промежуток времени.
Re: Как на время блокировать ВСЕ действия Юзера?
Добавлено: 03 Ноябрь 2010, 12:45
Korall
Спасибо! Оператором yield я баловался, но что получается: во время расчета юзер жмет от скуки в разные пункты меню, так как все подтормаживает, жмет по много раз, а затем, после окончания расчета, эти все нажатия начинают отрабатываться, вдруг открывается куча окон, что-то запускается, и юзер не знает, где он теперь находится. Видимо выход вообще все меню сделать disable на время расчета.
А про второй вариант я пока не очень понял, буду help долбить.
Спасибо еще раз!!