¿Cómo haces que un programa duerma en C++ en Win 32?

5 minutos de lectura

avatar de usuario
cris_45

¿Cómo se “pausa” un programa en C++ en Win 32 y qué bibliotecas se deben incluir?

avatar de usuario
IVlad

#include <windows.h>

Sleep(number of milliseconds);

O si desea pausar su programa mientras espera otro programa, use WaitForSingleObject.

  • Error 2 error C3861: ‘Suspender’: identificador no encontrado //a pesar de #include

    – Chris_45

    12 de febrero de 2010 a las 14:36


  • ¿Puedes publicar tu código y qué compilador estás usando? Esto funciona en mi máquina con GCC: #include int main () { Sleep(1000); }

    – IVlad

    12 de febrero de 2010 a las 14:44

  • Ok, tienes que tener el moderno y así sucesivamente primero en la línea y los antiguos después de estos, ¿es eso una regla? Al menos funcionó con ese orden.

    – Chris_45

    12 de febrero de 2010 a las 14:50

  • Tal vez tenía un archivo de inclusión que de alguna manera impedía que se incluyera windows.h. ¿Qué encabezados incluiste? No puedo reproducir su error con / / . Generalmente, pongo los encabezados del sistema primero.

    – IVlad

    12 de febrero de 2010 a las 14:58


  • El error incluye: #include #include #include #include #include usando el espacio de nombres estándar;

    – Chris_45

    12 de febrero de 2010 a las 15:00

En C ++ 11, puede hacer esto con las instalaciones de biblioteca estándar:

#include <chrono>
#include <thread>
std::this_thread::sleep_for(std::chrono::milliseconds(x));

avatar de usuario
Juan Gietzen

Si está usando boost, puede usar el thread::sleep función:

#include <boost/thread/thread.hpp>
boost::system_time time = boost::get_system_time();
time += boost::posix_time::seconds(1);
boost::thread::sleep(time); 

De lo contrario, tendrá que usar la API win32:

#include <windows.h>
Sleep(1000);

Y, aparentemente, C++0x incluye esto:

#include <thread>
std::this_thread::sleep_for(chrono::seconds(1));

  • Dios mío, esa última línea es fea.

    –Steve Jessop

    12 de febrero de 2010 a las 20:48

  • @Steve: Mis disculpas.

    – Juan Gietzen

    12 de febrero de 2010 a las 21:20

  • No te culpo, a menos que estés en el comité estándar de C++ 😉

    –Steve Jessop

    13 de febrero de 2010 a las 2:03

Tenga en cuenta que el código anterior se probó en Code::Blocks 12.11 y Visual Studio 2012
en Windows 7.

Para forzar la detención o espera de su programa, tiene varias opciones:


  • dormir (int sin firmar)

El valor tiene que ser un entero positivo en milisegundos. Eso significa que si desea que su programa espere 2 segundos, ingrese 2000.

Aquí hay un ejemplo:

#include <iostream>     //for using cout
#include <stdlib.h>     //for using the function sleep

using namespace std;    //for using cout

int main(void)         
{
   cout << "test" << endl;
   sleep(5000);         //make the programme waiting for 5 secondes
   cout << "test" << endl;
   sleep(2000);         // wait for 2 secondes before closing

   return 0;
}

Si espera demasiado, eso probablemente significa que el parámetro está en segundo lugar. Así que cámbialo así:

sleep(5);

Para aquellos que reciben un mensaje de error o un problema al usar el modo de suspensión, intente reemplazarlo por _sleep o Sleep, especialmente en Code::Bloks.
Y si aún tiene problemas, intente agregar una de estas bibliotecas al principio del código.

#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <dos.h>
#include <windows.h>

  • sistema (“PAUSA”)

Un simple programa “Hola mundo” en la aplicación de la consola de Windows probablemente se cerraría antes de que pueda ver algo. Ese es el caso en el que puede usar el sistema (“Pausa”).

#include <iostream>    

using namespace std;   

int main(void)         
{
    cout << "Hello world!" << endl;

    system("PAUSE");

    return 0;
}

Si recibe el mensaje “error: el ‘sistema’ no se declaró en este ámbito”, simplemente agregue la siguiente línea al principio del código:

#include <cstdlib>

  • cin.ignorar()

Se puede llegar al mismo resultado usando cin.ignore() :

#include <iostream>     

using namespace std;    

int main(void)         
{
    cout << "Hello world!" << endl;

    cin.ignore();

    return 0;
}

  • cin.get()

ejemplo :

#include <iostream>     

using namespace std;    

int main(void)         
{
    cout << "Hello world!" << endl;

    cin.get();

    return 0;
}

  • obtener ()

Simplemente no olvide agregar la biblioteca conio.h:

#include <iostream>     
#include <conio.h>    //for using the function getch()

using namespace std;    

int main(void)
{

    cout << "Hello world!" << endl;

    getch();

    return 0;
}

Puede tener un mensaje que le indique que use _getch() en lugar de getch

Si desea que el programa siga respondiendo mientras está “en pausa”, debe usar un evento de temporizador.

  • en realidad, en Qt, si desea que su programa responda mientras está en pausa desde un fragmento de código que se ejecuta desde el subproceso principal, no desea que el evento de tiempo de espera de su temporizador ocurra también en el subproceso principal.

    – yan bellavance

    24 de febrero de 2010 a las 15:22


avatar de usuario
TED

Depende del tipo de programa que estés escribiendo.

Una aplicación de consola puede simplemente llamar a Sleep. Una aplicación GUI probablemente lo haga no desea hacer esto, ya que todos los menús y widgets se volverán insensibles y la aplicación no se volverá a dibujar durante este período. En su lugar, debe hacer algo como configurar un temporizador con una devolución de llamada cuando expire.

  • en realidad, en Qt, si desea que su programa responda mientras está en pausa desde un fragmento de código que se ejecuta desde el subproceso principal, no desea que el evento de tiempo de espera de su temporizador ocurra también en el subproceso principal.

    – yan bellavance

    24 de febrero de 2010 a las 15:22


avatar de usuario
yan bellavance

No use una función de suspensión en su GUI si el marco con el que está trabajando no la proporciona. Esto podría crear problemas de referencia a los datos (especialmente en un hilo que no es el hilo principal). Esto podría congelar su GUI. No es solo una cuestión de dormir por un corto tiempo, use waitmutexes si necesita hacer eso.

¿Ha sido útil esta solución?