es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

C++ – sf::Thread congela el hilo principal cuando se ejecuta en el bucle while(window.isOpen())

Estoy intentando lanzar un sf::Thread (porque los hilos predeterminados de C++ son extremadamente malos, ya que se bloquean constantemente al ejecutarlos en el bucle \ while (window.isOpen())\ ) en mi proyecto, que muestra un texto en un cuadro (esto se supone que es el hilo de modificación de texto).

El problema surge al ejecutar el hilo en el bucle \ while (window.isOpen())\ , donde congela el hilo principal hasta que haya terminado la ejecución. Sin embargo, ejecutarlo antes no congela el programa y se ejecutará de forma independiente.

El hilo es \ sf::Thread t (std::bind (Display, std::ref (* messageBoxText), & amp; quot; algunas cosas al azar & amp; quot ;, 2000));\ , donde messageBoxText es un \ sf::Text\ , & quot; algunas cosas al azar & quot; es una \ std::string\ y 2000 es un \ int\ que indica el retraso en milisegundos.

La función Display es:

static void Display (sf :: Text & amp; text, std :: string textToPut, int msDelay = 10000) {
            conts int TEXT <em> NEWLINE  CONSTANT = 52;
            int size = textToPut.size (); 

         vector & amp; lt; string & amp; gt; strings;

         const int numberOfNewlines {(size / TEXT_NEWLINE_CONSTANT) + 1};


         for (int i {0}; i & amp; lt; numberOfNewlines; i ++) {
             string tmp {& amp; quot; & amp; quot; };
             for (int j {TEXT_NEWLINE_CONSTANT * i}; j & amp; lt; TEXT_NEWLINE_CONSTANT * (i + 1) & amp; & amp; j & amp; lt; size; j ++) {
                 tmp + = textToPut [j];
             }
             strings.push_back (tmp);
         }

         for (int i {0}; i & amp; lt; numberOfNewlines; i ++) {
             if (i == 0) {
                 text.setString (strings [i]);
             } else if (i & amp; gt; 0) {
                 string tmp = strings [i - 1] + & amp; quot; \ n & amp; quot; + strings [i];
                 text.setString (tmp);
             }
             sf :: sleep (sf :: milliseconds (msDelay));
         }

         sf :: sleep (sf :: milliseconds (msDelay * 2)); 
     }

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Solución

    El problema de que el hilo principal se congele al lanzar un sf::Thread en el bucle while (window.isOpen()) se puede resolver creando un hilo separado para el proceso de modificación de texto. Esto se puede lograr de la siguiente manera:

    1. Declarar una bandera std::atomic_bool para indicar cuándo debe terminar el hilo de modificación. Esta bandera se puede establecer en true cuando se cierra la ventana principal.

      c++
      std::atomic_bool isRunning{true};

    2. Definir una función para que sirva como hilo de modificación de texto. Esta función debería tomar una referencia al objeto sf::Text, el texto a modificar y el retraso entre las modificaciones.

      c++
      void modifyText(sf::Text& text, const std::string& str, int delay) {
      // dividir el texto en líneas en función de una longitud de línea constante
      // modificar el texto y actualizar el objeto sf::Text
      // esperar el retraso especificado
      }

    3. Lanzar el hilo de modificación dentro del bucle while utilizando la clase std::thread.

      “`c++
      while (window.isOpen()) {
      // …

      if (/* alguna condición para activar la modificación de texto */) {
      std::thread t(modifyText, std::ref(messageBoxText), “algunas cosas al azar”, 2000);
      t.detach();
      }

      // …

      if (!isRunning) {
      window.close(); // cerrar la ventana principal
      }
      }
      “`

    4. Cuando se cierra la ventana principal, establecer la bandera isRunning en false. Esto hará que el hilo de modificación se termine.

      c++
      isRunning = false;

    Al lanzar el hilo de modificación de texto mediante la clase std::thread y separarlo, el hilo se ejecutará de manera independiente al hilo principal sin congelar el programa. El uso de una bandera atómica también garantiza que el hilo de modificación se pueda terminar de manera limpia cuando el programa se cierre.

Comments are closed.