Я не знаю, в чем причина вашей ошибки (но в комментариях есть некоторые правдоподобные объяснения). Тем не менее, один из способов решить вашу проблему - использовать другую перегрузку wait_for
, которая включает в себя предикат.
Это может выглядеть примерно так (hasImage
здесь просто бул, замените его чем-нибудь это имеет смысл для ваших нужд - !imageStorage.empty()
или аналогичный):
while (true)
{
if (cv.wait_for(uniqueLock, std::chrono::milliseconds(1000), []() {return hasImage;}))
{
std::cout << "has image" << std::endl;
hasImage = false;
}
else
{
std::cout << "time out " << std::endl;
}
}
Уместным моментом является то, что предикат проверяет, действительно ли существует новое изображение, а если его нет, то он должен продолжать wait.
Одним из ограничений этого метода является то, что, если предикат возвращает false (без изображения), то вы не знаете, проснулась ли переменная условия из-за ложного пробуждения, тайм-аута или, если они действительно существуют. было изображение, но другой поток просто забрал его, прежде чем этот проснулся. Но если с этим может справиться ваш дизайн, то этот вариант работает очень хорошо.