tiempos tiempo segundos sacar programa funcion ejecucion como calcular c++ c++11 chrono

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 );