Supongamos que tengo el código de C++ tales como

#include "myheaderfiles.h"
//..some stuff
//...some more stuff
int main()
{
   double milliseconds;
   int seconds;
   int minutes;
   int timelimit=2;
   ...
   ...
   //...code here that increments 
   //.....milliseconds,seconds, and minutes

   while(minutes <=timelimit)
   {
      //...do stuff
      if(milliseconds>500)
      {
         //...do stuff 
         //...every half second
      } //end if
   } //end while
}//end main

El programa se ejecuta bien y hace lo que su supone que debe hacer, pero se va a utilizar hasta el 90%+ de mi cpu.

Me sugirieron el uso de usleep() en mi bucle while nunca 100ms o así, ya que realmente sólo se preocupan por hacer las cosas cada 500ms de todos modos. De esta manera, es el cerdo de la CPU cuando no sea necesario.

Así que he añadido a mi bucle while como

   while(minutes <=timelimit)
   {
      //...do stuff
      if(milliseconds>500)
      {
         //...do stuff 
         //...every half second
      } //end if
      usleep(100000);
   } //end while

Compila bien, pero cuando voy a ejecutarlo, el programa se cuelga a la derecha en usleep y no volver nunca. En algún lado leí que antes de llamar a usleep, que uno necesita para eliminar todos los búferes, por lo que me vacían todas las secuencias de archivo y couts, etc, etc. Todavía no hay suerte.

He buscado durante 2 días para una solución. He usado sleep() demasiado, sin suerte.

He encontrado un par de alternativas, pero parece complicado y añadir una gran cantidad de código a mi programa que realmente no entienden completamente lo que va a complicar y hacer un lío, además de que podría no funcionar.

Yo nunca pensemos demasiado en mi while() bucles de antes, porque la mayoría de los programas escribí para microcontroladores o FPGAs que no es ningún problema para acaparar el procesador.

Si alguien puede ayudar…. recursos, enlaces,libros? Gracias.

  • Por favor, dime que no estás usando la CPU reloj para medir el tiempo…
  • Puede usted mostrar su completa bucle while (). Podría haber muchas razones para esto y es conocido como bucle ocupado problema. usleep() no causaría ningún cuelgue. Hay algo mal en el código.
  • Me pregunto — ¿hay algo que hacer para el programa o es sólo de brazos cruzados en algún lugar de votación? Si hay algo que hacer, hacerlo más rápido no duele (en *nix o windows uno podría bajar la prio, aunque). Si eres de votación, tal vez no es un evento impulsado solución?
  • ¿por qué no acaba de registrarse a tener un temporizador despertador y te llaman cada medio segundo si eso es lo que quieres? esta no parece ser la solución adecuada para empezar. está usted seguro de que está colgado en usleep? tal vez no eres el incremento de los ‘milisegundos’ correctamente.
  • ¿utiliza la señal en su programa, por casualidad?
  • Mysticial, sí, estoy en la medición del tiempo con el tiempo.h. Por qué?
  • Adam Bryant. Si vuelve a leer lo que escribí, funciona bien hasta que me pongo de usleep allí. Sé que se cuelga en la usleep porque se ejecuta todo lo que hasta llega a usleep. Si puedo quitar usleep, el programa se ejecuta bien, sólo te lleva hasta el 90% de la cpu, pero hace exactamente lo que su diseñados para hacer sin problemas. Yo no quiero que el cerdo de la cpu!
  • ¿Alguien puede proporcionar un código muy simple con un bucle while, que se utiliza con éxito usleep para mí? Estaría muy agradecida!
  • Por favor, no me diga que usted tiene la intención de propósito ralentizar la ejecución de su programa? ¿Has pensado en las personas que no quieren esperar más tiempo, o los que tienen más lento de la Cpu y se requiere aún más tiempo?

InformationsquelleAutor user3474042 | 2014-04-11

3 Comentarios

  1. 2

    Su enfoque algo que viene desde el extremo equivocado. Un programa de debe consumir 90-100% de la CPU mientras tenga algo útil que hacer (y se debe bloquear el contrario, el consumo cero de la CPU).

    Dormir entre provocará que la ejecución de estar más tiempo sin una buena razón, y consumen más energía de la que acaba de hacer el trabajo tan rápido como sea posible (al 100% de la CPU) y, a continuación, bloquear por completo hasta más trabajo disponible o hasta que alguna otra cosa importante (por ejemplo, la mitad de un segundo ha pasado, si lo que importa para usted) que sucede.

    Con eso en mente, la estructura de su programa en una manera conceptualmente como:

    while(blocking_call() != exit_condition)
    {
        while(have_work)
            do_work();
    }

    También, no dormir durante la ejecución, pero el uso de temporizadores (por ejemplo,setitimer) para hacer algo a intervalos regulares. Esto no sólo será más eficiente, pero también mucho más precisa y fiable.

    Exactamente cómo implementar esto depende de cómo portátil que usted quiere que su software. En Ubuntu/Linux, por ejemplo, puede utilizar Api como epoll_wait con eventfd en lugar de escribir un manejador de señal para el temporizador.

  2. 0

    Este código funciona como se espera que para mí (que se ejecuta en OSX, aunque).

      #include <unistd.h>
      #include <iostream> 
    
      int main() {
        std::cout << "hello" << std::endl;
    
        int i = 0;
        while(i < 10) {
          ++i;
          usleep(100000);
          std::cout << "i = " << i << std::endl;                                                                                                                                        
        }
        std::cout << "bye" << std::endl;
        return 0;
      }
  3. 0

    Hay un problema lógico o tal vez usted está haciendo varios contadores? Ya que usted dijo que usted ha hecho de los microcontroladores, supongo que usted está tratando de usar reloj de los ciclos como un método de conteo, mientras que llamar a los temporizadores del sistema? También, lo que me tiene dudando es si usted está recomendado para uso usleep(x), ¿por qué estás usando doble para milisegundo? usleep(1) es de 1 microsegundo == 1000 milisegundos. El sueño(x) es un contador por cada x segundos, para que el sistema de suspensión es tarea actual para x cantidad de segundos.

    #include <iostream>
    #include <unistd.h>
    
    using namespace std;
    
    #define MILLISECOND 1000
    #define SECOND 1000*MILLISECOND
    
    int main(int argc, char *argv[]){
        int time = 20;
        int sec_counter = 0;
        do{     
            cout<<sec_counter<<" second"<<endl;
            usleep(SECOND);
            sec_counter++;
        } while(sec_counter<time+1);
        return 0;
    }

    Si quería usar 500ms, a continuación, reemplace usleep(SEGUNDO) con usleep(500*milésima de segundo).
    Yo sugiero utilizar un depurador paso a paso a través de su código para ver qué está pasando.

    • Sólo quería señalar que 1 microsegundo no es igual a 1000 milisegundos, es la otra manera alrededor. Quizás desee revisar que la última parte de su respuesta.

Dejar respuesta

Please enter your comment!
Please enter your name here