2015-03-19 4 views
2

Я пытаюсь использовать библиотеку хронологии STL в C++ 11 для измерения продолжительности цикла. Таким образом, я пытаюсь сделать что-то выглядит следующим образом:сравнение результатов STL chrono с плавающей запятой

using std::chrono; 

double frame_time = 40; // Temporal resolution milliseconds 
auto start = high_resolution_clock::now(); 
while (get_frame(frame)) { 
    // Do something 
    auto end = high_resolution_clock::now(); 
    auto elapsed = duration_cast<milliseconds>(end - start); 

    // Now I want to do something like: 
    if (elapsed < frame_time) { sleep(frame_time-elapsed);} 
    start = high_resolution_clock::now(); 
} 

Однако, что результаты сравнения в ошибки, как:

no match for ‘operator<’ (operand types are ‘std::chrono::duration<long 
          int, std::ratio<1l, 1000l> >’ and ‘double’) 

ответ

2

Ваш frame_time также длительность, так почему бы не использовать std::chrono::milliseconds? Таким образом, ваш код станет более чистым (вам не понадобится ваш комментарий для начала) и более безопасным, например, если sleep() было изменено на использование микросекунд, компилятор может предупредить вас или выбрать правильную перегрузку.

+0

Извините, бит путают. frame_time здесь является переменной типа double. Вы имеете в виду преобразовать его в тип продолжительности? – Luca

+1

нет, не конвертировать. Не используйте 'double' в первую очередь. Сделайте 'frame_time' переменной переменной' миллисекунды'. –

+0

Ahhhh ... Понятно. Я немного упростил это. Frame_time на самом деле происходит из стороннего lib, и это возвращает его как double. Я поставил его на какое-то твердое значение, чтобы подчеркнуть мою проблему. – Luca

1

Вы не можете сравнивать chrono::duration и дважды. Просто используйте count функцию объекта продолжительности.

if (elapsed.count() < frame_time) 
{ 
    sleep(frame_time-elapsed.count()); 
} 
+0

Спасибо! Сделал то, что я хотел :) – Luca

+1

или лучше использовать 'std :: chrono :: milliseconds' вместо double для frame_time –

+0

@FabioFracassi: Это должен быть альтернативный ответ (и я бы поставил его над этим ответом) – MSalters

 Смежные вопросы

  • Нет связанных вопросов^_^