Хотя ответы и комментарии, размещенные здесь, были полезны, они не были причиной проблемы в моем случае.
Фактическая проблема заключалась в том, что образец поступал после того, как я уничтожил объект обратного вызова. Я думал, что решил эту проблему, используя «флаг, мьютекс и переменную условия», как описано в моем комментарии, но эта реализация была неправильной.
Решение, которое решило проблему, было следующим:
- Определите два 64-битных счетчика ReceiveSamples и requiredSamples. Кроме того, флаг "остановлено", мьютекс и переменная условия.
- После запуска заблокируйте мьютекс и установите счетчики на 0, а флаг остановки - на false. Затем вызовите sourceReader-> ReadSample, чтобы инициировать получение первого образца.
- В Stop, заблокируйте мьютекс, установите для остановленного flog значение true и используйте условную переменную, чтобы дождаться, пока receiveSamples == requiredSamples.
- В OnReadSample заблокируйте мьютекс, увеличьте счетчик receiveSamples, разблокируйте мьютекс и уведомите переменную условия.
- Непосредственно перед вызовом sourceReader-> ReadSample заблокировать мьютекс (если он еще не принадлежал), чтобы увеличить счетчик requiredSamples.
Я добавлю фрагмент кода, который вскоре это продемонстрирует