9

Я заметил, что, когда Excel 2007 (и, возможно, более ранние версии) имеет фокусировку окна, Excel работает на полной скорости, что означает, что файлы открываются быстро, и долго выполняющиеся макросы VBA выполняются быстро.

Если окно Excel теряет фокус, приоритет потока Excel резко падает, и большие файлы, которые открывались, когда вы медленно перемещали фокус, открываются, а сложные макросы VBA занимают много времени.

Есть ли способ сохранить высокий приоритет Excel независимо от того, является ли он сфокусированным или нет?

Я знаю, что мог бы искусственно повысить приоритет потока с помощью диспетчера задач, но я не уверен, какие это могут быть последствия для моих таблиц или ОС.

Моя система представляет собой быстрый двухъядерный процессор с 4 ГБ оперативной памяти и работает под управлением Vista 64.

РЕДАКТИРОВАТЬ ДЛЯ УТОЧНЕНИЯ:

Моя проблема не просто в повышении приоритета процесса Excel с помощью диспетчера задач, потому что это влияет только на Excel, когда у него есть фокус окна.

Дело в том, что происходит, когда Excel теряет фокус окна.

С помощью Excel широко, оказывается , что, в соответствии с проектом, он намеренно опускает свой собственный приоритет процесса , когда окно Excel не имеет фокуса.

Установка более высокого приоритета для процесса Excel не мешает этому произойти - он только дает Excel более высокий приоритет процесса, когда он имеет фокус, но все же резко падает, когда теряет фокус.

При обычном использовании Excel (вероятно, 99% всех, кто его использует) вы бы не заметили этот эффект, но с массивной электронной таблицей (я думаю, около 2000 листов) и сложными макросами VBA, выполнение которых занимает несколько минут, эффект очень заметно.

В идеале мне нужно, чтобы он сохранял один и тот же приоритет потока независимо от того, фокусируется ли окно Excel.

До сих пор я просто отсиживался от компьютера в течение нескольких минут во время обработки, чтобы случайно не щелкнуть окно Excel, когда оно хрустит, но я просто надеялся, что есть лучшее решение ... возможно взломать реестр какой-то?

РЕДАКТИРОВАТЬ:

Я только когда-либо нашел еще одно упоминание об этой проблеме в сети по этой ссылке

Это соответствующая цитата ...

Однако, если я сделаю окно Excel 2000 видимым для пользователя, а также оставлю его в фокусе, макросы будут выполняться с ожидаемой скоростью. Опять же, окно должно иметь фокус, или макрос снова замедляет сканирование.

7 ответов7

6

Несерверные выпуски Windows по умолчанию обеспечивают повышение приоритета переднего плана. Когда вы толкаете Excel в фоновый режим, он теряет тот импульс, который ранее был на переднем плане; какая-то другая программа вместо этого получает повышение приоритета.

Вы можете изменить настройку, чтобы программы больше не получали такой импульс. Примечание. Это повлияет не только на Excel, но и на любую программу, которая в противном случае получила бы повышение.

Вот как можно изменить настройки в Windows XP:

  1. Щелкните правой кнопкой мыши Мой компьютер.
  2. Выберите Свойства.
  3. Перейдите на вкладку « Дополнительно ».
  4. На панели « Производительность» нажмите кнопку « Настройки».
  5. Перейдите на вкладку « Дополнительно ». Первая панель - Планирование процессора:

    Панель планирования процессора

  6. Измените его со значения по умолчанию "Программы" на "Фоновые службы", и это должно привести к тому, что Excel будет вести себя ближе, чем вы хотите, когда он находится в фоновом режиме.

4

Я не думаю, что есть проблема с изменением приоритета процесса Excel на Above Normal в вашем случае. Это не должно быть проблемой.

Не делайте это самый высокий, где он будет конкурировать с системными процессами.
Не приостанавливайте его, иначе на нем могут быть приостановлены другие вещи!


Если вы используете Process Explorer Марка Руссиновича
смотреть на приоритеты процессов, работающих в вашей системе.
Он показывает следующие значения приоритета и их связь.

24 Realtime
13 High         : procexp.exe itself is here, with winlogon, csrss
11              : smss is actually at 11
10 Above Normal :
 9              : lsass, services.exe are here
 8 Normal       : Most things are here
 6 Below Normal
 4 Idle

Вы можете использовать Process Explorer и попробовать изменить приоритеты для Excel.
Переместите его выше 8, но не превышайте 12
Выше нормы в 10 следует делать, я ожидаю.

Кроме того, если вы думаете, что какой-то процесс занимает слишком много процессорного времени, в то время как не в фокусе, вы можете понизить его приоритет вплоть до простоя.
Я обычно использую эту технику для этого.

2

Здесь необходимо учитывать несколько моментов: когда вы меняете приоритет процесса, этот базовый приоритет наследуется всеми его потоками и другими процессами, которые он запускает. Текущий приоритет составлен из базового приоритета и ряда факторов, которые определяют, следует ли его повышать или нет - нахождение на переднем плане само по себе не обязательно повышает приоритет, но такие вещи, как выход из состояния ожидания или выполнение некоторого ввода-вывода, могут дать короткий временный импульс.

Я бы предположил, что выполнение вашего процесса Excel с высоким приоритетом при работе с этими очень интенсивными рабочими книгами может иметь смысл, и я бы сказал, что второй способ под названием "Высокоприоритетный Excel" может быть хорошим способом сделать это. Сначала создайте однострочный пакетный файл, который запускает команду запуска с соответствующими переключателями, например:

start "high priority excel" /max /high "C:\Program Files\Microsoft Office\Office12\EXCEL.EXE"

(в 64-разрядной версии Windows это будет start "high priority excel" /max /high "C:\Program Files (x86)\Microsoft Office\Office12\EXCEL.EXE" если только вы не используете 64-разрядную версию Office, который доступен только для 2010 года, start "high priority excel" /max /high "C:\Program Files\Microsoft Office\Office14\EXCEL.EXE"). Обратите внимание, что заголовок окна может быть любым, но не является обязательным

Теперь сохраните это как, например, HiperExcel.cmd где-нибудь под рукой - может быть, офисную папку, или папку ac:\scripts или что-то подобное, или вашу домашнюю папку, чтобы это могло перемещаться с компьютера на компьютер. Создайте новый ярлык, который указывает на этот файл, сделайте стартовую папку папкой, в которой хранится файл. Выберите значок для файла. Перейдите к исполняемому файлу Excel.exe, а затем для ясности выберите что-то, кроме обычного значка Excel .

Щелкните по вашему новому ярлыку, и он вызовет Excel, запущенный как процесс с высоким приоритетом, с базовым приоритетом 13, а при запуске он, вероятно, получит максимальный приоритет для процессов не в реальном времени, равный 15. Даже если что-то еще получает повышение, оно не должно получить более высокий приоритет. Обратите внимание, что процесс переднего плана НЕ получает повышение приоритета только за то, что находится на переднем плане (не начиная с NT4.0). Так, что происходит?

Подчеркните то, что мы знаем до сих пор: процессы становятся по очереди в соответствии с приоритетом, но не с абсолютным исключением процессов с более низким приоритетом (ну, на самом деле, с потоками, но давайте оставим процессы для удобства обсуждения). Что происходит, когда процесс получает свою "очередь"? Он запускается на единицу времени, называемую квантом. Как долго это квант? Это зависит...

Именно здесь процесс переднего плана использует больше ресурсов - когда он получает ход, этот ход может длиться в три раза дольше, чем ход фоновых процессов. Таким образом, он может не очень часто (в зависимости от приоритета), но когда это происходит, он затягивает его дольше.

Вы можете выбрать использование коротких или длинных квантов (по умолчанию - короткая для ОС рабочей станции, длинная - для серверов), а также для ускорения или ускорения процесса переднего плана (переменная для w/s, фиксированная для серверов по умолчанию), а при необходимости - для сколько (эффективно до 3 раз). Теперь сложная часть этого заключается в том, что если вы решите изменить множитель, вы получите все, что имеет очень короткие значения для кванта, тогда как если вы отключите форсирование переднего плана, то все получится длиннее, но в равной степени. Если вы отключите его, конечно, фоновые службы Windows получат ту же квоту, что и ваши пользовательские приложения, что может быть не идеально. Необходимо установить значение в реестре по адресу: HKLM\System\CurrentControlSet\Control\PriorityControl\Win32PrioritySeparation, используя битовую маску. Чтобы упростить задачу, наиболее вероятные значения:

2 = значение по умолчанию, означает использование значений по умолчанию с максимальным усилением. значения по умолчанию на рабочей станции O/S являются короткими и переменными. 8 = фиксированный, короткий квант (передний план и фон равны) 40 (десятичный, шестнадцатеричный x28) = фиксированный и длинный (то же самое, что и значения по умолчанию для сервера) 36 (десятичный, шестнадцатеричный x24) = короткий, переменный, но минимальный коэффициент усиления для процесса переднего плана , Я думаю, что это тот, который, вероятно, даст вам наибольшую выгоду, чтобы уменьшить количество конкурирующих приложений, но позволит Excel получить больше ресурсов, когда на переднем плане (если вы также повысите его приоритет).

Попробуйте и посмотрите, надеюсь, это поможет - ваш пробег может меняться, конечно.

Кроме того: во многих других приложениях или процессах узким местом является центральный процессор - ваши примеры синхронизации Outlook и просмотра IE, вероятно, имеют сеть, и, возможно, для Outlook некоторые дисковые операции ввода-вывода являются более важными факторами их скорости, так что они получают Повышение на переднем плане или нет, влияние видимой производительности, вероятно, ниже того, что вы можете увидеть простым наблюдением.

1

Нет проблем с повышением приоритета процесса до "выше нормального" или "высокого", просто не устанавливайте его в "реальном времени". Не могу вам помочь с Excel, особенно извините.

1

Возможно, что манипулирование приоритетом выполняется не Excel, а самой Windows. В Windows есть механизм, где повышается приоритет процессов с окнами на переднем плане ; поэтому, когда Excel теряет фокус, его приоритет возвращается к нормальному (что немного ниже).

Единственная страница в MSDN, которую я смог найти с помощью быстрого поиска, - это « Приоритетные повышения»:

Когда процесс, использующий NORMAL_PRIORITY_CLASS на передний план, планировщик повышает класс приоритета процесса, связанного с окном переднего плана, так что он больше или равен классу приоритета любых фоновых процессов. Класс приоритета возвращается к своей первоначальной настройке, когда процесс больше не находится на переднем плане.

Из того, что я слышал, есть способы отключить повышение приоритета.

0

Просто попробуйте это, у меня получилось.

Не очень хороший способ, но он фактически удвоил мою скорость вычислений! Удивительно! (но я проверю результаты, не уверен насчет них ...)

Ваша форма пользователя должна быть в центре экрана в 1024 * 768. Это просто отправить с помощью программного обеспечения правой кнопкой мыши на пользовательской форме.

Полный расчет, но не используйте ваш компьютер, пока он рассчитывает (запуск других программ, Windows ..).

Просто попробуйте и скажите мне, как это сработало для вас!

'In General
Private Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal Y As Long) As Long
Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
Private Const MOUSEEVENTF_LEFTDOWN = &H2
Private Const MOUSEEVENTF_RIGHTDOWN As Long = &H8
Private Const MOUSEEVENTF_RIGHTUP As Long = &H10

Private Sub Optimizer()
    'activate the window
    'AppActivate "Inbox - Microsoft Outlook"
    'move the cursor where you need it, I guessed at 200,200
    'Warning here : check the center coordinates of your userform!
    SetCursorPos 512, 374
    'send a down event
    mouse_event MOUSEEVENTF_RIGHTDOWN, 0&, 0&, 0&, 0&
    'and an up
    mouse_event MOUSEEVENTF_RIGHTUP, 0&, 0&, 0&, 0&
End Sub

'Inside your code
Call Optimiser`
0

После долгой ночи расчета полной скорости и после проверки результаты этого утра были ... совершенно неверными.

Так что я думаю, что это просто ошибка, вычисления не выполнены должным образом.

Нажатие на пользовательскую форму в расчете просто ускоряет скорость процесса, но не полностью пересчитывает лист за его пределами. Я точно, я был в реальном времени с Prio.

Еще одна приятная вещь - настроить задачу процесса с помощью prio_x64_199_2367.exe, http://softziz.com/2010/11/prio-64-bit-1-9-9/

Это сохранит ваш приоритет процесса, определенный с помощью CTRL ALT DEL, внутри диспетчера задач, для использования в будущем.

С уважением,

Джон

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .