|
Аналог процедуры 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
|
||||
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
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |