Estoy luchando con llamar a una función de desorden de un hilo adicional. Uso boost :: thread para threading y la biblioteca de clutter 1.0.C++ - Clutter 1.0 - la función de llamada desde el hilo causa segfault
Para ser específico, el subproceso contiene una función en bucle que emite boost :: signals2 :: señal con parámetros de coordenadas x e y de vez en cuando. Esa señal se conecta a una función que manos esas variables para el desorden, es decir, x, y en
clutter_stage_get_actor_at_pos (CLUTTER_STAGE (Actor), CLUTTER_PICK_ALL, X, Y);
Y ahí es donde recibo una segfault.
Parece que el desorden tiene algunas rutinas de manejo de hilos. Intenté llamar a
g_thread_init (NULL);
clutter_threads_init();
antes de iniciar clutter_main(). También traté de adjuntar la función de desorden en
clutter_threads_enter();
clutter_stage_get_actor_at_pos (CLUTTER_STAGE (actor), CLUTTER_PICK_ALL, x, y);
clutter_threads_leave();
sino que también no hace el truco ..
Cada pista se aprecia, gracias por adelantado!
Adición
acabo forjaron una muestra mínima de lo que estoy tratando de hacer. Ya 'protegí' la rutina clutter_main() como se sugiere. Algunas funciones de desorden parecen funcionar (por ejemplo, establecer el color de la etapa o establecer la posición del actor) del hilo separado. ¿Todavía hay algo mal con mi código?
#include <clutter/clutter.h>
#include <boost/thread.hpp>
ClutterActor *stage;
ClutterActor* rect = NULL;
void receive_loop()
{
while(1)
{
sleep(1);
clutter_threads_enter();
ClutterActor* clicked = clutter_stage_get_actor_at_pos(CLUTTER_STAGE(stage), CLUTTER_PICK_ALL,300, 500);
clutter_threads_leave();
}
}
int main(int argc, char *argv[])
{
clutter_init(&argc, &argv);
g_thread_init(NULL);
clutter_threads_init();
stage = clutter_stage_get_default();
clutter_actor_set_size(stage, 800, 600);
rect = clutter_rectangle_new();
clutter_actor_set_size(rect, 256, 128);
clutter_actor_set_position(rect, 300, 500);
clutter_group_add (CLUTTER_GROUP (stage), rect);
clutter_actor_show(stage);
boost::thread thread = boost::thread(&receive_loop);
clutter_threads_enter();
clutter_main();
clutter_threads_leave();
return 0;
}
Cambia el código para usar pthread en lugar de boost :: thread ya que no estás utilizando ninguna magia de Boost y la mayoría de las personas aquí no lo tienen instalado. – karlphillip