Я пытаюсь собрать данные с USB-порта, используя D3XX.NET из FTDI.Данные собираются и затем отправляются в быстрое преобразование Фурье для построения спектра.Это прекрасно работает, даже если вы пропустите некоторые данные.Ты не можешь сказать.Однако, если вы затем захотите отправить эти данные на компонент вывода звука, вы заметите, что данные отсутствуют.Вот где моя проблема, кажется.Данные собираются и затем отправляются на аудиоустройство.Все пакеты делают это в течение необходимого промежутка времени.Тем не менее, звук сбрасывает данные, которые появляются.Вот изображение того, как синусоида выглядит на выходе аудио:
Вы можете видеть, что некоторые данные отсутствуют в началеи кажется, что целый цикл отсутствует в конце.Это только один пример, он постоянно меняется.Иногда кажется, что данных просто нет.Я прошел всю цепочку обработки, и я уверен, что пакеты данных для звука делают это.С тех пор я использовал профилировщик производительности JetBrains.Я обнаружил следующее: метод ReadPipe занимает 8,5 мс, что в точности соответствует ожидаемому чтению.Все идет нормально.Как только команда ReadPipe закончится, у вас есть 0,5 мс, чтобы сделать другую ReadPipe, или вы потеряете некоторые данные.Глядя на вывод профилировщика, я вижу это:
ReadPipe занимает 8,5 мс, а затем есть эта запись для сборки мусора, которая в среднем занимает 1,6 мс,Если это действительно происходит даже иногда, то я потерял некоторые данные.
Итак, вот код: Это фоновый работник:
private void CollectData(object sender, DoWorkEventArgs e)
{
while (keepGoing)
{
ftStatus = d3xxDevice.ReadPipe(0x84, iqBuffer, 65536, ref bytesTransferred); //read IQ data - will get 1024 pairs - 2 bytes per value
_waitForData.Set();
}
}
Ручка ожидания указывает другому потоку, что данныедоступен.Так GC является причиной потери данных?И если так, как я могу избежать этого?Спасибо!