sacar - tiempo en segundos c++
convertir los segundos como doble a std:: chrono:: duration? (4)
Estoy usando c ++ 11 <chrono>
y tengo una cantidad de segundos representados como un doble. Quiero usar c ++ 11 para dormir durante esta duración, pero no puedo entender cómo convertirlo en un objeto std::chrono::duration
que std::this_thread::sleep_for
requiere.
const double timeToSleep = GetTimeToSleep();
std::this_thread::sleep_for(std::chrono::seconds(timeToSleep)); // cannot convert from double to seconds
He bloqueado en la referencia <chrono>
pero lo encuentro bastante confuso.
Gracias
EDITAR:
Lo siguiente da error:
std::chrono::duration<double> duration(timeToSleep );
std::this_thread::sleep_for(duration);
el error:
:/program files (x86)/microsoft visual studio 11.0/vc/include/chrono(749): error C2679: binary ''+='' : no operator found which takes a right-hand operand of type ''const std::chrono::duration<double,std::ratio<0x01,0x01>>'' (or there is no acceptable conversion)
2> c:/program files (x86)/microsoft visual studio 11.0/vc/include/chrono(166): could be ''std::chrono::duration<__int64,std::nano> &std::chrono::duration<__int64,std::nano>::operator +=(const std::chrono::duration<__int64,std::nano> &)''
2> while trying to match the argument list ''(std::chrono::nanoseconds, const std::chrono::duration<double,std::ratio<0x01,0x01>>)''
2> c:/program files (x86)/microsoft visual studio 11.0/vc/include/thread(164) : see reference to function template instantiation ''xtime std::_To_xtime<double,std::ratio<0x01,0x01>>(const std::chrono::duration<double,std::ratio<0x01,0x01>> &)'' being compiled
2> c:/users/johan/desktop/svn/jonsengine/jonsengine/src/window/glfw/glfwwindow.cpp(73) : see reference to function template instantiation ''void std::this_thread::sleep_for<double,std::ratio<0x01,0x01>>(const std::chrono::duration<double,std::ratio<0x01,0x01>> &)'' being compiled
No hagas std::chrono::seconds(timeToSleep)
. Quieres algo más como:
std::chrono::duration<double>(timeToSleep)
Alternativamente, si timeToSleep
no se mide en segundos, puede pasar una proporción como parámetro de plantilla a la duration
. Vea here (y los ejemplos allí) para más información.
Si la respuesta de @Cornstalks sea un poco más genérica, podría definir una función como esta:
template <typename T>
auto seconds_to_duration(T seconds) {
return std::chrono::duration<T, std::ratio<1>>(seconds);
}
Esto convertirá un valor de segundos de cualquier tipo primitivo en una duración de crono. Úsalo así:
const double timeToSleep = GetTimeToSleep();
std::this_thread_sleep_for(seconds_to_duration(timeToSleep));
const unsigned long timeToSleep = static_cast<unsigned long>( GetTimeToSleep() * 1000 );
std::this_thread::sleep_for(std::chrono::milliseconds(timeToSleep));
std::chrono::milliseconds duration(timeToSleep);
std::this_thread::sleep_for( duration );