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.

SDL2: A veces se produce un fallo de segmentación al Renderizar y consultar Eventos en un hilo diferente.

En mi proyecto, creo un hilo de eventos para capturar el evento sdl y tal vez pasarlo al hilo principal para renderizar. Pero a veces obtengo un Segementfault. Este es mi código de prueba.

“`c++
#include "SDL2/SDL.h"
#include <sdl2 sdl_timer.h="">
#include <iostream>
#include <thread>

using namespace std;

int main() {
SDL_Init(SDL_INIT_EVERYTHING);

<pre><code>bool running = true;
/* este es mi hilo de eventos */
auto run = [&] {
for (; running; ) {
SDL_Event event; SDL_PollEvent(&event);
// …
SDL_Delay(10);
}
};
thread t(run);

/* y el principal es el hilo de renderizado */
for (int i = 0; i < 10; ++i) {
SDL_Window *window = SDL_CreateWindow("cycle.",
100,
100,
600,
600,
SDL_WINDOW_SHOWN);

SDL_Renderer *screen = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);

// … hacer algo de renderizado …
// tal vez obtenga alguna tarea para renderizar usando la cola de bloqueo

SDL_Delay(500);
SDL_DestroyRenderer(screen);
SDL_DestroyWindow(window);

}

running = false;
t.join();

SDL_Quit();
</code></pre>

}
“`

Quiero saber por qué obtengo el Segementfault.
¿Debería hacer la escucha de eventos y el renderizado en el mismo hilo? (Esto causará otro problema: si se coloca en el mismo hilo, cuando configuro el bucle para que ocurra solo 60 veces por segundo, también significa que solo puedo renderizar 60 veces por segundo. Esto hará que mi programa se quede bloqueado).

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Podría haber varias razones por las que está obteniendo un error de segmentación. Una posible razón podría ser que su hilo de eventos está accediendo a recursos compartidos que están siendo modificados por el hilo principal de renderizado de forma concurrente. Esto podría llevar a condiciones de carrera y corrupción de memoria, lo cual podría resultar en errores de segmentación.

    Para solucionar este problema, es necesario sincronizar el acceso a los recursos compartidos utilizando mecanismos de bloqueo como mutex o semáforos. También se debe evitar acceder a los recursos compartidos desde múltiples hilos de forma concurrente tanto como sea posible.

    Con respecto a su segunda pregunta, si es conveniente separar la escucha de eventos y el renderizado en hilos separados o no depende de sus requisitos. Si su aplicación tiene restricciones de tiempo real y necesita responder rápidamente a la entrada del usuario, entonces podría ser beneficioso separar la escucha de eventos y el renderizado en hilos separados. Sin embargo, si su aplicación no tiene tales restricciones y el renderizado no es muy intensivo, entonces puede ser más simple mantener ambos en el mismo hilo.

    Para evitar el problema de que el programa se quede atascado cuando establece el ciclo a solo 60 veces por segundo, puede utilizar el renderizado basado en tiempo en lugar de en cuadros. El renderizado basado en tiempo asegura que la velocidad de renderizado sea proporcional al tiempo transcurrido, por lo que puede renderizar tan rápido como sea posible sin quedarse atascado.

Comments are closed.