Sé que la sleep(x)función POSIX hace que el programa duerma durante x segundos. ¿Existe una función para hacer que el programa duerma x milisegundos en C ++?
Debe tener en cuenta que, en Windows de todos modos, Sleep()tiene una precisión de milisegundos , pero su precisión puede ser mucho mayor. Puede pensar que duerme durante 4 milisegundos, pero en realidad duerme durante 400.
John Dibling
55
@ John Dibling: Creo que está usando POSIX sleep, no win32 Sleepdado "x segundos".
CB Bailey
1
Aunque C y C ++ tienen nombres diferentes, que pueden ser una fuente de errores e incompatibilidades, en la mayoría de los casos está bien usar encabezados C en C ++. Sin embargo, si desea estar absolutamente seguro de que nada sale mal, #includeel encabezado C dentro de un extern "C" {}bloque. Además, si tiene archivos fuente C y C ++ en el mismo proyecto, se recomienda encarecidamente que haga esto para evitar cualquier problema, especialmente si incluye los mismos encabezados en ambos tipos de archivos fuente (en cuyo caso esto es necesario) . Si tiene un proyecto puramente C ++, podría funcionar sin ningún problema.
adam10603
2
@ JohnDibling no, no 400ms. La peor precisión que podría haber obtenido fue de Windows 9x, que GetTickCounttenía una resolución de 55 ms; Las versiones posteriores tenían una resolución de 16 ms o menos. Un usuario pensó que estaba obteniendo una resolución de 16 ms de Sleep, pero luego informó que Sleepera bastante preciso y que la aparente imprecisión fue causada por el uso GetTickCountpara medir el paso del tiempo.
Qwertie
Respuestas:
457
Tenga en cuenta que no hay una API C estándar para milisegundos, por lo que (en Unix) tendrá que conformarse usleep, lo que acepta microsegundos:
Debe incluir <unistd.h> o <Windows.h> respectivamente.
gbmhunter
Sí, pero ¿no podría la resolución de tiempo real ser 15-16 ms (incluso si la unidad en la llamada es 1 ms) y, por lo tanto, el tiempo mínimo sería 15-16 ms?
Peter Mortensen
33
Dependiendo de su plataforma que pueda tener usleepo nanosleepdisponible. usleepestá en desuso y se ha eliminado del estándar POSIX más reciente; nanosleepse prefiere.
Uno de los problemas con ese código es que es un bucle ocupado, continuará usando el 100% de un núcleo de procesador único. La función de suspensión se implementa alrededor de una llamada del sistema operativo que detendrá el hilo actual y hará otra cosa, y solo despertará el hilo cuando expire el tiempo especificado.
Ismael
Tienes razón: consumirá el 100% de un núcleo de una CPU. Así que aquí está el código reescrito usando las funciones de suspensión del sistema, y todavía es multiplataforma:
Bart Grzybicki
@BartGrzybicki Sé que esta es una respuesta antigua y todo, pero en Visual Studio 2017 en una máquina con Windows, #ifdef WIN32no se evalúa como verdadero por defecto.
kayleeFrye_onDeck
2
El código de @kayleeFrye_onDeck está mal. Debería ser #ifdef _WIN32.
Contango
1
@Contango ¡Lo sabía! Pero no cuando escribí eso ... jajaja. ¡Gracias por el seguimiento!
kayleeFrye_onDeck
17
nanosleepes una mejor opción que usleep: es más resistente a las interrupciones.
No use la palabra "estándar" cuando no lo diga en serio. no<concrt.h> es un encabezado de biblioteca estándar; puede ser una biblioteca de plataforma; en cuyo caso debe indicar claramente los requisitos previos.
Toby Speight
5
En plataformas con la selectfunción (POSIX, Linux y Windows) puede hacer:
void sleep(unsignedlong msec){
timeval delay ={msec /1000, msec %1000*1000};int rc =::select(0, NULL, NULL, NULL,&delay);if(-1== rc){// Handle signals by continuing to sleep or return immediately.}}
Sin embargo, hay mejores alternativas disponibles hoy en día.
Parece que no se puede compilar en VS2017 en una máquina con Windows:error LNK2019: unresolved external symbol _select@20 referenced in function "void __cdecl sleep(unsigned long)" (?sleep@@YAXK@Z)
kayleeFrye_onDeck
@kayleeFrye_onDeck Se compila. Simplemente no se vincula. Busque sus documentos de Windows.
Maxim Egorushkin
¿Qué encabezado utilizas para timeval?
Totte Karlsson
@TotteKarlsson <sys/time.h>.
Maxim Egorushkin
4
La forma de dormir su programa en C ++ es el Sleep(int)método. El archivo de encabezado es#include "windows.h."
Por ejemplo:
#include"stdafx.h"#include"windows.h"#include"iostream"usingnamespace std;int main(){int x =6000;Sleep(x);
cout <<"6 seconds have passed"<< endl;return0;}
El tiempo que duerme se mide en milisegundos y no tiene límite.
¿Qué quieres decir con que no tiene límite? Seguramente tiene un límite que es 0xFFFFFFFE. Esperar a 0xFFFFFFFF simplemente no expirará (lo que significa que esperará hasta que finalice el programa).
Izzy
No quise decir eso, Izzy, perdón por nuestro malentendido. Quise decir que puedes ingresar cualquier número positivo de milisegundos. Por lo tanto, esperará tantos milisegundos para cerrar el programa. Si no entiende, por favor dígalo, le explicaré más.
Phi
Sí, pero ¿cuál es la resolución de tiempo real? ¿No podrían ser 15-16 ms en algunos casos? Por ejemplo, si usa Sleep (3), ¿realmente dormirá durante 3 ms o en lugar de 15-16 ms?
Peter Mortensen
3
Seleccionar llamada es una forma de tener más precisión (el tiempo de suspensión se puede especificar en nanosegundos).
Si bien esto podría ser una pista valiosa para resolver el problema, una buena respuesta también demuestra la solución. Por favor edición para proporcionar código de ejemplo para mostrar lo que quiere decir. Alternativamente, considere escribir esto como un comentario.
Toby Speight
3
Utilice los subprocesos asíncronos de entrada / salida de Boost, duerma durante x milisegundos;
¿Qué pasará realmente si intentas dormir durante 3 milisegundos? ¿Serán 15-16 milisegundos en su lugar? ¿Lo has medido?
Peter Mortensen
1
La pregunta es antigua, pero logré encontrar una manera simple de tener esto en mi aplicación. Puede crear una macro C / C ++ como se muestra a continuación, úsela:
Sleep()
tiene una precisión de milisegundos , pero su precisión puede ser mucho mayor. Puede pensar que duerme durante 4 milisegundos, pero en realidad duerme durante 400.sleep
, no win32Sleep
dado "x segundos".#include
el encabezado C dentro de unextern "C" {}
bloque. Además, si tiene archivos fuente C y C ++ en el mismo proyecto, se recomienda encarecidamente que haga esto para evitar cualquier problema, especialmente si incluye los mismos encabezados en ambos tipos de archivos fuente (en cuyo caso esto es necesario) . Si tiene un proyecto puramente C ++, podría funcionar sin ningún problema.GetTickCount
tenía una resolución de 55 ms; Las versiones posteriores tenían una resolución de 16 ms o menos. Un usuario pensó que estaba obteniendo una resolución de 16 ms de Sleep, pero luego informó queSleep
era bastante preciso y que la aparente imprecisión fue causada por el usoGetTickCount
para medir el paso del tiempo.Respuestas:
Tenga en cuenta que no hay una API C estándar para milisegundos, por lo que (en Unix) tendrá que conformarse
usleep
, lo que acepta microsegundos:fuente
usleep
para eso?nanosleep
puede ser una mejor opción ya queusleep
es obsoleta.En C ++ 11, puede hacer esto con las instalaciones de biblioteca estándar:
Claro y legible, ya no es necesario adivinar qué unidades
sleep()
toma la función.fuente
sleep_for
para eso?Para mantenerse portátil, puede usar Boost :: Thread para dormir:
Esta respuesta es un duplicado y se ha publicado en esta pregunta anteriormente. Quizás puedas encontrar algunas respuestas útiles allí también.
fuente
boost::this_thread::sleep
agrega un punto de interrupción a su código. boost.org/doc/libs/1_49_0/doc/html/thread/…En Unix puedes usar usleep .
En Windows hay suspensión .
fuente
Dependiendo de su plataforma que pueda tener
usleep
onanosleep
disponible.usleep
está en desuso y se ha eliminado del estándar POSIX más reciente;nanosleep
se prefiere.fuente
usleep()
se declara en<unistd.h>
, confusamente,nanosleep()
se declara en<time.h>
/<ctime>
.¿Por qué no usar la biblioteca time.h? Se ejecuta en sistemas Windows y POSIX:
Código corregido: ahora la CPU permanece en estado inactivo [2014.05.24]:
fuente
#ifdef WIN32
no se evalúa como verdadero por defecto.#ifdef _WIN32
.nanosleep
es una mejor opción queusleep
: es más resistente a las interrupciones.fuente
usleep
, pero nonanosleep
. Debe proporcionar un ejemplo de uso en Linux.Sintaxis:
Uso:
fuente
#include <WinBase.h>
#include <windows.h>
Si usa MS Visual C ++ 10.0, puede hacerlo con las instalaciones de biblioteca estándar:
necesitará:
fuente
<concrt.h>
es un encabezado de biblioteca estándar; puede ser una biblioteca de plataforma; en cuyo caso debe indicar claramente los requisitos previos.En plataformas con la
select
función (POSIX, Linux y Windows) puede hacer:Sin embargo, hay mejores alternativas disponibles hoy en día.
fuente
error LNK2019: unresolved external symbol _select@20 referenced in function "void __cdecl sleep(unsigned long)" (?sleep@@YAXK@Z)
<sys/time.h>
.La forma de dormir su programa en C ++ es el
Sleep(int)
método. El archivo de encabezado es#include "windows.h."
Por ejemplo:
El tiempo que duerme se mide en milisegundos y no tiene límite.
fuente
Seleccionar llamada es una forma de tener más precisión (el tiempo de suspensión se puede especificar en nanosegundos).
fuente
Utilice los subprocesos asíncronos de entrada / salida de Boost, duerma durante x milisegundos;
fuente
La pregunta es antigua, pero logré encontrar una manera simple de tener esto en mi aplicación. Puede crear una macro C / C ++ como se muestra a continuación, úsela:
fuente
Desde C ++ 14 usando std y también sus literales numéricos:
fuente
Como reemplazo de Win32 para sistemas POSIX:
fuente
nanosleep()
ausleep()
: éste es obsoleto y ha sido borrado de la norma más reciente POSIX.