Добрый день!
Ситуация следующая: в окне Юзер запустил расчет, в большом цикле что-то считается (минуты...), курсор на время работы цикла сделал: setCursor(Cursor:Wait), но если юзер ткнет куда-нибудь в кнопку, весь экран становится белесым и программа виснет. Кларион 5.5, шаблоны Синявского (не АБС), хочу сделать что-то перед запуском цикла, чтобы ЛЮБЫЕ нажатия клавиш и мыши вообще программой не воспринимались, а после окончания расчета опять все обрабатывалось.
Что мне сделать?
Как на время блокировать ВСЕ действия Юзера?
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
- WadimZapara
- Активист
- Сообщения: 181
- Зарегистрирован: 11 Июнь 2008, 12:11
- Откуда: Тамбов
Re: Как на время блокировать ВСЕ действия Юзера?
А может, не стоит блокировать юзверя ?
А вместо этого:
1) в каждой итерации цикла делать YIELD
2) периодически делать DISPLAY(?Progress), DISPLAY(?Counter)
3) пореже периодически делать DISPLAY
- и никакого "белёсого экрана" и "зависания"
ЗЫ:
1) Блокировка клавиш и мыши только в программе - не поможет (после переключения на другую задачу - будет то же самое).
2) Блокировать клаву и мышь на всём компе более сложно, а главное - совсем неправильно.
ЗЫ2:
А может, просто стоит переписать алгоритм цикла по типу:
- И никаких проблем 
(контролы во время процесса блокированы,
на события окна, системы - реагирует, переключайся куда и когда хочешь,
закрыть окно по крестику и Alt-F4 невозможно)
Единственное - оптимально подобрать значения для таймера (здесь 50 в секунду) и числа итераций цикла (здесь 100) за этот промежуток времени.
А вместо этого:
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: Как на время блокировать ВСЕ действия Юзера?
Спасибо! Оператором yield я баловался, но что получается: во время расчета юзер жмет от скуки в разные пункты меню, так как все подтормаживает, жмет по много раз, а затем, после окончания расчета, эти все нажатия начинают отрабатываться, вдруг открывается куча окон, что-то запускается, и юзер не знает, где он теперь находится. Видимо выход вообще все меню сделать disable на время расчета.
А про второй вариант я пока не очень понял, буду help долбить.
Спасибо еще раз!!
А про второй вариант я пока не очень понял, буду help долбить.
Спасибо еще раз!!