|
Как прервать выполнение процедуры? | ☑ | ||
|---|---|---|---|---|
|
0
anna_pas
23.05.08
✎
11:32
|
Подскажите, как прервать выполнение процедуры, если время выполнения превысило заданный интервал? При этом процедура запускается при помощи ОткрытьФормуОтчета()?
|
|||
|
1
Irbis
23.05.08
✎
11:33
|
Читать текущее время сравнивать с временем запуска
|
|||
|
2
anna_pas
23.05.08
✎
11:34
|
Вопрос не в том как посчитать время! А как прервать выполнение процедуры?
|
|||
|
3
Irbis
23.05.08
✎
11:36
|
Возврат
|
|||
|
4
Guk
23.05.08
✎
11:35
|
Возврат. Пипец...
|
|||
|
5
FreeFin
23.05.08
✎
11:45
|
Много лет назад задавал вопрос о прерывании "тяжелого" Запроса, во время его выполнения в обработке/отчете (не на группировках после, а именно в момент "Выполняется...". А есть ли способ?
|
|||
|
6
Guk
23.05.08
✎
11:46
|
(5) эскейп...
|
|||
|
7
FreeFin
23.05.08
✎
11:56
|
(6) Нет, по эскапу Запрос не прерывается.
|
|||
|
8
Guk
23.05.08
✎
12:00
|
(7) гонишь...
|
|||
|
9
levlvov
23.05.08
✎
12:02
|
кнопка POWER
|
|||
|
10
FreeFin
23.05.08
✎
12:03
|
(8) А попробуй. Пока "Выполняется обработка...", только клавишу в стол не забей )))
|
|||
|
11
levlvov
23.05.08
✎
12:06
|
(10) я и говорю не эскайп, а кнопка POWER
|
|||
|
12
FreeFin
23.05.08
✎
12:09
|
(11) глубину шутки все уже поняли, повторяться не надо.
|
|||
|
13
anna_pas
23.05.08
✎
12:13
|
Так я понимаю ответ на мой вопрос - никак?
|
|||
|
14
FreeFin
23.05.08
✎
12:30
|
(13) Почему никак?
Можно попробовать, запустив в обработке некую "сканирующую" конструкцию (с Формат, лень искать) Процедура Сформировать() Секунд=_GetPerformanceCounter()/1000; Часов=Цел(Секунд/3600); СекОстМин= Секунд%3600; Минут=Цел(СекОстМин/60); Сек=СекОстМин%60; Пол=Сек+Минут*60+Часов*3600; Если Часов<10 Тогда Часов="0"+СокрЛП(Часов); Иначе Часов=СокрЛП(Часов); КонецЕсли; Если Минут<10 Тогда Минут="0"+СокрЛП(Минут); Иначе Минут=СокрЛП(Минут); КонецЕсли; Если Сек<10 Тогда Сек="0"+СокрЛП(Сек); Иначе Сек=СокрЛП(Сек); КонецЕсли; Время=Часов+":"+Минут+":"+Сек; Сообщить(Время); КонецПроцедуры //*********** Процедура ПриОткрытии() Форма.ОбработкаОжидания("Сформировать",10); КонецПроцедуры Задать интервал опроса, и по разнице от заданного вываливаться в Возврат СтатусВозврата(0 или Форма.Закрыть(0) в зависимости от состояния выполнения процедур в форме |
|||
|
15
FreeFin
23.05.08
✎
12:36
|
+14 хотя сильно чото сомневаюсь, что оно прервет выполняемую процедуру, тут чот как-то иначе мутить надо )))
Прочем, как время посчитать=пойдет. |
|||
|
16
dk
23.05.08
✎
12:48
|
(13) Надо различать
1) прервать процедуру 2) прервать выполняемую команду --- 1) Прервать можно, просто навтыкать условия на время в разных местах процедуры 2) программно нельзя, только интерактивно (это если без извратов) |
|||
|
17
FreeFin
23.05.08
✎
13:02
|
(16) Да ладно, неужели
WshShell=CreateObject("WScript.Shell"); WshShell.SendKeys("{ESC}"); все еще изврат? |
|||
|
18
dk
23.05.08
✎
13:25
|
(17) В контексте (16) - да, изврат
Можно узнать из какого места эту команду собрался запускать? :) |
|||
|
19
FreeFin
23.05.08
✎
15:48
|
(18) Извините, уезжал )
Я понимаю, что псевдо-интерактивно вовсе и не надо (не зачем), но вот пример (извратный, с прерыванием выполнения процедуры по эскейп, через 10 секунд, не совсем корректно разницу времени считает. но это не принципиально): Перем Ждем,Часов,Минут,Сек; //******** Процедура Рвать() WshShell=CreateObject("WScript.Shell"); WshShell.SendKeys("{ESC}"); WshShell.SendKeys("{Enter}"); WshShell.SendKeys("{ESC}"); КонецПроцедуры //******************************************* Процедура Время(Секунд) Секунд=_GetPerformanceCounter()/1000; Часов=Цел(Секунд/3600); СекОстМин= Секунд%3600; Минут=Цел(СекОстМин/60); Сек=СекОстМин%60; Пол=Сек+Минут*60+Часов*3600; Если Часов<10 Тогда Часов="0"+СокрЛП(Часов); Иначе Часов=СокрЛП(Часов); КонецЕсли; Если Минут<10 Тогда Минут="0"+СокрЛП(Минут); Иначе Минут=СокрЛП(Минут); КонецЕсли; Если Сек<10 Тогда Сек="0"+СокрЛП(Сек); Иначе Сек=СокрЛП(Сек); КонецЕсли; Время=Часов+":"+Минут+":"+Сек; Сообщить(Время); КонецПроцедуры //********* Процедура Сформировать() Секунд=_GetPerformanceCounter()/1000; Время(Секунд); НачСек=Число(Сек); Блин=2; Для Ном=1 По 1000000000000 Цикл Блин=Блин*2; Секунд=_GetPerformanceCounter()/1000; Время(Секунд); Если (Число(Сек)-НачСек)>Ждем Тогда Рвать(); КонецЕсли; КонецЦикла; КонецПроцедуры Ждем=10; Разница между Прервать; СтатусВозврата(0); Возврат; Есть или нет? |
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |