PDA

Просмотр полной версии : пауза в макросе VBA Excel с освобождением процессора



Kaban
07.12.2004, 12:59
проблема в следующем..
в терминал сервере работает N-ое количество пользователей.. помимо работы в приложениях Офис используются другие программы. когда пользователи запускают макросы Екселя процессор загружен на 100% и естесвенно остальные могут пойти и покурить пока не завершится макрос данного пользователя. А иногда бывает что макросы обрабатывают большие массивы данных и это занимает порядка 15-20 минут.. вот другие и начинают нервничать.
Вопрос - КАКОЙ КОМАНДОЙ VBA СОЗДАЕТСЯ ПАУЗА В ВЫПОЛНЕНИИ МАКРОСА С ОСВОБОЖДЕЕМ ПРОЦЕССОРНОГО ВРЕМЕНИ ???

--------------------------------
ЗАРАНЕЕ ВСЕМ САПАСИБО

Absurd
07.12.2004, 13:43
Процессор тормозится с целью его охлаждения. Делается это не руками, такие дела должна делать ядро ОС.
Производительность таким способом не поднять, можно только избежать пререгрева и сгорания железа.
Если макросы работают по 15-20 минут, то надо такие дела перекладывать на бызы данных - Access, MS-SQL.

Kaban
07.12.2004, 13:53
Процессор тормозится с целью его охлаждения. Делается это не руками, такие дела должна делать ядро ОС.
Производительность таким способом не поднять, можно только избежать пререгрева и сгорания железа.
Если макросы работают по 15-20 минут, то надо такие дела перекладывать на бызы данных - Access, MS-SQL.

Уважаемый Absurd, в таком случае, если вас не затруднит подскажите как в системе ограничить пользователю процессорное время, или по другому какой параметр Win200 server может определить потолок используемого процессорного времени для одного Юзера..
--------------------------------
ЗАРАНЕЕ ВСЕМ СПАСИБО

uhm57
09.12.2004, 10:58
Вот если я правильно понял, о чем речь, то нужно в "тормозящие" макросы, там, где циклы используются, вставить команду DoEvents.



DoEvents passes control to the operating system. Control is returned after the operating system has finished processing the events in its queue and all keys in the SendKeys queue have been sent.

DoEvents is most useful for simple things like allowing a user to cancel a process after it has started, for example a search for a file.

mosquit
09.12.2004, 17:13
Абсолютно правильно советует uhm57, можно только уточнить, что если используются вложенные циклы, то команда DoEvents должна быть в теле самого внутреннего цикла.

И еще, если макрос выполняется 15-20 минут, есть повод задуматься об эффективности алгоритма, а может быть и о переходе на другие средства.

Naeel Maqsudov
09.12.2004, 19:26
У меня есть такое смутное ощущение, что DoEvents в данном случае не поможет...
Если в макросе там и сям натыкать DoEvents то это позволит пользователю, запустившему макрос не дожидаться окончания работы макроса, а заставить Excel откликаться на события и что-то еще делать. Если Exel отжирает все остатки от CPU, то терминал-сервер всяко будет загибаться.

Во время DoEvents Excel овлекается от непосредственного исполнения макроса и смотрит, не приехали ли его окнам какие-нибудь сообщения (WM_..., ну WM_KEYDOWN, например), и если да, то обрабатывает их. Как только он это сделано он возвращается к исполнению макроса до следующего попадания на DoEvents. Т.е. DoEvents это способ сделать так, чтобы Excel не ушел в себя на период выполнения макроса, но напротив, чтобы макрос выполялся как бы в фоновом режиме.

В данной ситуации поможет скорее WinAPI-шная функция Sleep. Вызовем из макроса функцию Sleep(X) и Excel заснет на X милисекунд освобождая CPU для других процессов.

Т.е. я вижу 2 пути решения:
1) Sleep, но при этом каждый пользователь запустивший макрос может сам пойти покурить, причем не на 20 минут а гораздо дольше
2) Более ответственно отнесьтись к конфигурации оборудования, на котором будет эксплуатироваться терминал-сервер


Есть еще мысль: терминал сервер, на сколько я понимаю, присылает клиенту содержимое экрана... Так вот, возможно, во время работы макроса очень сильно обновляется окно Excel и сам терминал-сервер съедает остатки CPU на досылку быстро изменяющегося содержимого экрана. Попробуйте запрещать перерисовку экрана в макросе. Т.е. в начале работы макроса запретить, а по окончании - разрешить...

Вообще Вы смотрели какой из процессов съедает CPU? Поэкспериментируйте и замерьте.

mosquit
09.12.2004, 19:53
Не знаю, может быть есть разница в интерпретациях VB и VBA, но в VB DoEvents однозначно позволяет обработать все сообщения, а не только сообщения данного приложения. А при использовании Sleep возможен неоправданный простой процессора.