Я написал приложение-сервис в Borland C++. Он работает нормально. В процедуре ServiceStart (TService * Sender, bool & Started) я вызываю mjwinrun для запуска процесса, который обрабатывает и обрабатывает макросы. Этот процесс не имеет интерфейса, и любые ошибки записываются в файл. Он продолжает работать, пока сервер не перезагрузится, не завершите работу или процесс не завершится с помощью диспетчера задач. Вот mjwinrun: -Процесс, порожденный службой Windows, запускается в 3-4 раза медленнее, чем порожден GUI
int mjwinrun(AnsiString cmd)
{
STARTUPINFO mjstupinf; PROCESS_INFORMATION mjprcinf;
memset(&mjstupinf,0,sizeof(STARTUPINFO)); mjstupinf.cb=sizeof(STARTUPINFO);
if (!CreateProcess(NULL,cmd.c_str(),NULL,NULL,TRUE,0,NULL,GetCurrentDir().c_str(),&mjstupinf,&mjprcinf))
{
LogMessage("Could not launch "+cmd); return -1;
}
CloseHandle(mjprcinf.hThread); CloseHandle(mjprcinf.hProcess);
return mjprcinf.dwProcessId;
}
cmd - это командная строка для запуска процессора очереди макросов. Я использовал макрос, интенсивно использующий CPU/Memory, и заставил его записать свои тайминги в файл. Вот что я нашел:
1) Если макропроцессор запущен из командной строки в сеансе входа в систему, независимо от того, в каком ядре Windows он работает, макрос завершается за 6 секунд.
2) Если макропроцессор запущен из службы, запускающейся на ядре Vista или ранее (используя mjwinrun выше), макрос завершается за 6 секунд.
3) Если макропроцессор запущен из службы, запущенной в ядре Windows 7 или более поздней (используя mjwinrun выше), макрос завершается более чем 18 секунд.
Я пробовал все различные флаги для CreateProcess, и ни один из них не имеет значения. Я пробовал все разные учетные записи для службы, и это не имеет никакого значения. Я попытался установить все приоритеты для задач, ввода/вывода и страницы, но все они не имеют значения. Это как если бы порожденные процессы службы каким-то образом были дросселированы, а не в терминах ввода-вывода, а в терминах использования процессора/памяти. Любые идеи, которые изменились в Windows 7 и далее?
Вряд ли быть ЦП, если система уже не работает. Что на самом деле делает макрос? –
CPU выделяет ядро, когда он выполняет макрос. Он читает в некоторых данных из базы данных и делает некоторую тяжелую обработку, чтобы поместить ее в удобочитаемую форму в текстовый файл вывода (формат CSV). Вы можете видеть, что он читает байты с помощью диспетчера задач, и он читает их в блоках 3 или 4 Кбайт, при случайном всплеске до 400-500 Кбайт за раз каждые 5 секунд. На более быстрой платформе эти всплески происходят каждую секунду. –
Если он максимизирует одно ядро в любом сценарии, то, очевидно, процесс не является дросселируемым ЦП. Возможно, Windows 7 экономит энергию более агрессивно? Ядро процессора, работающее на низкой частоте, является единственным разумным объяснением, которое я могу представить для 100% -18 секунд в одном сценарии, давая вам то же количество фактических вычислений, что и 100% -го-шесть секунд в другом сценарии. –