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