Имя: Пароль:
1C
 
Аналог процедуры doEvents
0 yaroshenko_p
 
29.10.15
11:17
Доброго времени суток!

Вопрос у меня такой.
Есть УТ11 на клиент-сервере.
Для неё написана внешняя обработка, в которой запущен долгий цикл.
При выполнении этого цикла начинает подвисать сервер, начинаются лаги у других пользователей, работающих с другими базами на этом сервере.
Конечно, оптимизация кода цикла - само собой, я над этим работаю.
Но, когда я работал на Visual Basic, я в таких случаях использовал функцию DoEvents(), которая передает управление операционной системе для обработки событий и сообщений, ждущих в системной очереди и всех нажатий клавиш из очереди SendKeys. После обработки всех событий управление возвращается приложению (следующий за строкой DoEvents инструкции).
Подскажите, пожалуйста, есть ли в 1С8 какой-нибудь аналог этой функции? Или его нет и быть не может?
Заранее благодарю за помощь.
1 Гёдза
 
29.10.15
11:18
На сервере никак. На клиенте ОбработкаПрерыванияПользователя
2 Гёдза
 
29.10.15
11:19
На сервере можно смотреть в сторону фоновых или
http://catalog.mista.ru/public/76309/
3 МихаилМ
 
29.10.15
11:24
либо фоновое задание либо увеличение числа процессов
4 yaroshenko_p
 
29.10.15
11:27
"На сервере никак. На клиенте ОбработкаПрерыванияПользователя"

Спасибо, но это не совсем то, что надо. ОбработкаПрерыванияПользователя(), как я понимаю, проверяет, не нажата ли Ctrl+Break, и если нажата, то завершает процесс совсем.

А мне надо, чтобы управление временно передавалось операционной системе, а потом процесс выполнялся дальше, и чтобы это происходило без участия пользователя. Как, например, в таком коде на Visual Basic:

for i=1 to N do

//Какие-то сложные действия, загружающие операционную систему
...

//Временная передача управления ОС для обработки событий и /сообщений, ждущих в системной очереди
doEvents()

//Возврат управления приложению


next i
5 oleg_km
 
29.10.15
11:38
(4) DoEvents имеет отношение только к интерфейсу, никакой ОС она не передает управление. Она дает возможность протолкнуть очередь сообщений окон конкретного приложения. Если у вас тормозит сервер, то значит или он слаб или задача слишком нагружная. Вот мы вчера обнаружили запрос, который при определенном отборе пытается сделать временную таблицу в миллион строк. Ложилась вся дисковая подсистема сервера. DoEvent не причем.
6 ДенисЧ
 
29.10.15
11:40
нет такого в 1с
7 oleg_km
 
29.10.15
12:10
(6) На 1С это можно эмулировать с помощью ПодключитьОбработчикОжидания
8 ДенисЧ
 
29.10.15
12:13
(7) Флаг тебе в руки
9 Serginio1
 
29.10.15
12:18
У обычной формы есть метод
Обновить();
У управляемой формы
ОбновитьОтображениеДанных()
10 Serginio1
 
29.10.15
12:19
В веб-клиенте обновление элементов управления происходит не сразу, а после окончания выполнения кода на встроенном языке.
11 oleg_km
 
29.10.15
12:22
(8) А в чем проблема?
12 ДенисЧ
 
29.10.15
12:22
(11) в непонимании тобой работы обработки ожидания
13 Гёдза
 
29.10.15
12:23
обработчик ожидания выполняется в ТОМ же (единственном) потоке
14 oleg_km
 
29.10.15
12:27
(13) Просто код разрываешь на части, соединяешь обработкой ожидания, вроде элементарно. Таким мегагуру даже разжевывать не хочется.
15 ДенисЧ
 
29.10.15
12:27
(14) Если ты можешь разорвать код на части, никакая обработка ожидания тебе не нужна уже.
16 Гёдза
 
29.10.15
12:29
(14) Кроме тестирования, такой подход нигде не встречал
17 oleg_km
 
29.10.15
12:33
(15) А как тогда запустить код следующей части?

(16) Ну хочется в некоторых случаях, чтобы пользователь мог прервать некий мегапроцесс. В общем-то да, всего в паре мест в программе.
18 Гёдза
 
29.10.15
12:35
(17) Чтоб прервать см (2)
19 oleg_km
 
29.10.15
12:38
(18) Ну это в неуправляемых формах. Я про обычные пишу
21 oleg_km
 
29.10.15
12:42
(20) Неуправляемые в смысле программистом, а управляемые 1С'ом. Не программист ими управляет, а 1С, хочет скролы включит, хочет все сдвинет куда-нибудь. Как хочет, так и управляет. А для меня эти формы неуправляемые.
Шутка.
22 Serginio1
 
29.10.15
12:48
(20) Хамство зашкаливает ...
23 ДенисЧ
 
29.10.15
12:50
(22) Это интернет, деточка. Тут и на три буквы послать могут
24 oleg_km
 
29.10.15
12:54
(22) Да нет, это он так поддел. Просто я управляемые формы неуправляемыми назвал, да еще и с обычными сравнил. А товарищ иронию не разглядел, цитатами начал кидаться.
25 Serginio1
 
29.10.15
12:55
(23) Это сообщество программистов, а не хамов.
Кстати сколько тебе лет. Например мне 52 годика.
Неужто 70?
(0) Можешь попробовать
https://msdn.microsoft.com/ru-ru/library/system.windows.forms.application.doevents(v=vs.110).aspx

Используя например
http://catalog.mista.ru/public/238584/
26 EvilBeaver
 
29.10.15
13:03
(0) Миста такая миста)) Не получится, так сделать.

Вы пишете: при выполнении цикла НА СЕРВЕРЕ подвисают пользователи в СОСЕДНИХ БАЗАХ. Ну и как прокачка очереди сообщений Windows вам тут поможет?
27 oleg_km
 
29.10.15
13:09
(26) Мне кажется, он уже понял. Я в (5) писал уже.
28 yaroshenko_p
 
29.10.15
13:57
Вы пишете: при выполнении цикла НА СЕРВЕРЕ подвисают пользователи в СОСЕДНИХ БАЗАХ. Ну и как прокачка очереди сообщений Windows вам тут поможет?

Подвисают пользователи, работающие в соседних базах, которые расположены на этом же сервере баз данных. Я предполагаю, что прокачка очереди сообщений Windows этого сервера может помочь, потому что это помогало в аналогичной ситуации с базой, написанной на Visual Basic
29 Гёдза
 
29.10.15
13:58
Ставь паузу внутри цикла
30 EvilBeaver
 
29.10.15
13:59
(28) вам помогало, но не это. Ваша база на VB была однопоточной и обрабатывала бизнес-логику в том же потоке, в котором работало клиентское окно. Вызывая DoEvents вы ОСТАНАВЛИВАЛИ обработку бизнес логики, прокачивали сообщения и снова начинали обработку. В (5) вам объяснили это уже.
31 Serginio1
 
29.10.15
14:18
(28) А какая очередь сообщений у сервера?
У него есть дискрипторы окон?
32 oleg_km
 
29.10.15
14:20
(28) прокачка очереди сообщений Windows этого сервера

Нет такой очереди, есть очередь сообщений ОКНА, и ее прокачка помогает разморозить только пользовательский интерфейс. Сервер затормозить может большая нагрузка: либо он слабенький, либо нагрузка левая. Но я уже повторяюсь. Посмотрите счетчики ОС, что там у вас не хватает: процессора, диска, памяти.
33 orefkov
 
29.10.15
15:09
(0)
Вам на VisualBasic помогало не то, что очередь событий окна прокачивалась, а то, что вы управление отдавали ОС, и она могла дать больше времени другим потокам и процессам. Иначе ваш поток старался пожирать процессорное время, как не в себя, а квотирования проца на винде нетути. Однако на соседние БАЗЫ это может повлиять, если только и клиент, и сервер, крутятся на одном компе. И тут достаточно в клиенте не очередь сообщений прокачивать, а периодически в цикле вставлять Sleep на пару миллисекунд. А уж это-то можно сделать кучей способов.
34 MM
 
29.10.15
15:40
(33) А вот и естьтути.
https://technet.microsoft.com/ru-ru/library/cc732553.aspx
Но не для всех. )
35 Serginio1
 
29.10.15
15:54
(33) Там скорее всего проблема не с потоками, а с дисковыми операциями. А так полностью смогласен насчет Sleep/
Кстати из 25
В отличие от Visual Basic 6.0 DoEvents не вызывает метод Thread.Sleep метод

То есть внутри Visual Basic 6.0 DoEvents  просто вызывается Sleep
36 Serginio1
 
29.10.15
15:56
То есть внутри Visual Basic 6.0 DoEvents  тоже вызывается Sleep