Бесконечный цикл потребляет 100% CPU

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

Мне нужен алгоритм, который генерирует частоту от нескольких Гц до кГц.

Я использую платформу Windows с С#.


person Danish    schedule 04.10.2012    source источник
comment
Вы смотрели различные классы таймеров?   -  person Oded    schedule 04.10.2012
comment
Это то, что вы ищете? stackoverflow.com/ вопросы/203890/   -  person tranceporter    schedule 04.10.2012


Ответы (4)


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

При этом какой джиттер вам разрешено иметь и какую максимальную частоту вам необходимо поддерживать?

person Zdeslav Vojkovic    schedule 04.10.2012

То, как я подошел бы к проблеме, состояло бы в том, чтобы генерировать «звуковую волну» и выводить ее на звуковую карту. Есть способы получить доступ к вашей звуковой карте из С#, например. с помощью XNA. Как указывали другие, использование ЦП для этого не является хорошим подходом.

person Joh    schedule 04.10.2012

Используйте Thread.Sleep(delay); в своем цикле

это уменьшает использование процессора

person burning_LEGION    schedule 04.10.2012
comment
Использование Thread.Sleep может не дать им достаточно высокого разрешения. При вызове Sleep он определяет только минимальное время, в течение которого он будет бездействовать, поэтому в загруженной системе Thread.Sleep(1) может спать дольше 1 мс (что в любом случае может быть дольше, чем указанное кГц). - person Matthew; 04.10.2012
comment
Thread.sleep определенно не так, как правильно упомянул Мэтью. Мне нужно сгенерировать частоту 1 кГц... микросекундное событие таймера с меньшей загрузкой процессора также сработает для меня. - person Danish; 04.10.2012

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

Вам нужно будет запустить генератор частоты в своем собственном потоке и вызвать

Thread.Sleep(yourFrequencyPeriodMs);

в каждой итерации периода.

person loopedcode    schedule 04.10.2012