Naeel Maqsudov » 09 дек 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? Поэкспериментируйте и замерьте.
У меня есть такое смутное ощущение, что 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? Поэкспериментируйте и замерьте.