Использование CPU не уменьшается во время SleepEx () - PullRequest
1 голос
/ 23 мая 2011

Моя программа представляет собой слайд-шоу.Он работает на машине с другими процессами, поэтому в ожидании отображения следующего слайда я вызываю SleepEx (N, false), ожидая, что он сократит почти до нуля количество используемого ЦП (N составляет от 100 мс до 5000 мс).На моей машине с XP Pro это именно то, что происходит, но на моей домашней машине с XP Home она регистрирует 30-80% CPU во время SleepEx ().Код представляет собой единый поток, поэтому все, что использует этот процессор, входит в вызов SleepEX ().Кто-нибудь видел это раньше?

Ответы [ 2 ]

1 голос
/ 23 мая 2011

Какой процесс занимает весь этот процессор?Если вы вмешиваетесь в процесс с помощью отладчика - где в трассировке стека он тратит время?

Попробуйте использовать ProcDump , чтобы создать дамп процесса, когда он достигнет этого пика ЦП.Затем проанализируйте трассировку стека, чтобы увидеть, где он застрял.Сделав это несколько раз, вы получите хороший пример того, где он проводит время.

0 голосов
/ 28 января 2013

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

Вы не должны помещать функцию Sleep () в однопоточное приложение, если оно имеет функцию обработки сообщений главного окна.Оконное приложение всегда должно обрабатывать оконные сообщения без заметной задержки, в другом случае это вызовет тупик, по крайней мере, для приложения.Последствия зависят от платформы Windows, настроек компилятора и конфигурации процессора, обычно приложение в режиме отладки имеет временный обходной путь.Но если вы запустите такое приложение, скомпилированное с настройками выпуска, оно может использовать одно ядро ​​ЦП с функцией, которая заблокировала его поток обработки сообщений в главном окне.

Раздел примечаний в описании функции MSDN Sleep () четко указывает на эту ситуацию.

Вам просто нужно запустить новый поток, чтобы использовать функцию Sleep (), чтобы разрешить свободный поток оконных сообщений в основном потоке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...