Бесконечный цикл потребляет 100% ресурсов процессора
Я застрял в ситуации, когда мне нужно сгенерировать определенную частоту в несколько Гц. Я пробовал мультимедийные таймеры и все остальное, что есть в интернете, но до сих пор бесконечный цикл с некоторыми условиями "в другом месте" дал мне лучшие результаты. Но проблема в этом подходе состоит в том, что он потребляет почти весь процессор, не оставляя места для других приложений для правильной работы.
Мне нужен алгоритм с любой генерирует частоту от нескольких Гц до кГц.
Я использую Windows Plateform с C#.
4 ответа
Вы не можете точно генерировать сигнал с фиксированной частотой на платформе не в реальном времени. В любой момент поток с высоким приоритетом из того же или другого процесса может заблокировать выполнение вашего потока. Например, когда запускается поток GC, рабочие потоки будут приостановлены.
При этом, какой джиттер у вас есть, и какую частоту вы должны поддерживать?
Я бы подошел к решению проблемы, сгенерировав "звуковую волну" и выведя ее на звуковую карту. Есть способы получить доступ к вашей звуковой карте из C#, например, используя XNA. Как уже отмечали другие, использование процессора для этого не очень хороший подход.
Поскольку вы генерируете таймер, вы хотите спать в зависимости от периода вашей частоты.
Вам придется запустить свой генератор частоты в своем собственном потоке и вызвать
Thread.Sleep(yourFrequencyPeriodMs);
в каждой итерации периода.
Использование Thread.Sleep(delay);
в вашей петле
это уменьшить использование процессора