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));
}
davy.ai
Solución
El problema de que el hilo principal se congele al lanzar un
sf::Thread
en el buclewhile (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:std::atomic_bool
para indicar cuándo debe terminar el hilo de modificación. Esta bandera se puede establecer entrue
cuando se cierra la ventana principal.c++
std::atomic_bool isRunning{true};
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
}
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
}
}
“`
Cuando se cierra la ventana principal, establecer la bandera
isRunning
enfalse
. 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.