Non riesco a chiamare una funzione di clutter da un thread aggiuntivo. Uso boost :: thread per la filettatura e la libreria di clutter 1.0.C++ - Clutter 1.0 - la funzione di chiamata dal thread causa segfault
Per essere specifici, il thread contiene una funzione in loop che emette il segnale boost :: signals2 :: con i parametri delle coordinate xey di tanto in tanto. Tale segnale è collegato ad una funzione che mani tali variabili ingombrare, cioè x, y in
clutter_stage_get_actor_at_pos (CLUTTER_STAGE (attore), CLUTTER_PICK_ALL, x, y);
Ed è qui che ottengo un segfault.
Apparentemente il disordine ha alcune routine di gestione dei thread. Ho provato a chiamare
g_thread_init (NULL);
clutter_threads_init();
prima di avviare clutter_main(). Ho anche provato a racchiudere la funzione di clutter in
clutter_threads_enter();
clutter_stage_get_actor_at_pos (CLUTTER_STAGE (attore), CLUTTER_PICK_ALL, x, y);
clutter_threads_leave();
ma questo non significa anche fare il trucco ..
Ogni suggerimento è apprezzato, grazie in anticipo!
Addendum
Ho appena forgiato un campione minimo di quello che sto cercando di fare. Ho già "protetto" la routine clutter_main() come suggerito. Alcune funzioni di ingombro sembrano funzionare (ad esempio, impostare il colore dello stage o impostare la posizione dell'attore) dal thread separato. C'è ancora qualcosa di sbagliato nel mio codice?
#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 il tuo codice per usare pthread invece di boost :: thread dato che non stai usando alcuna magia Boost e la maggior parte delle persone qui non la ha installata. – karlphillip