C ++ - Clutter 1.0 - вызов функции из потока вызывает segfault

Я борюсь с вызовом функции беспорядка из дополнительного потока. Я использую boost :: thread для потоковой передачи и библиотеку clutter 1.0.

Чтобы быть конкретным, поток содержит циклическую функцию, которая время от времени испускает boost :: signal2 :: signal с параметрами координат x и y. Этот сигнал связан с функцией, которая передает эти переменные помехам, то есть x, y в

clutter_stage_get_actor_at_pos (CLUTTER_STAGE (субъект), CLUTTER_PICK_ALL, x, y);

И здесь я получаю segfault.

Очевидно, в беспорядке есть некоторые процедуры обработки потоков. Я пробовал вызвать

g_thread_init (NULL);

clutter_threads_init ();

перед запуском clutter_main (). Я также попытался включить функцию беспорядка в

clutter_threads_enter ();

clutter_stage_get_actor_at_pos (CLUTTER_STAGE (актер), CLUTTER_PICK_ALL, x, y);

clutter_threads_leave ();

но это тоже не помогает ..

Мы ценим каждую подсказку, заранее спасибо!

Приложение

Я только что подделал минимальный образец того, что я пытаюсь сделать. Я уже «защитил» процедуру clutter_main (), как было предложено. Некоторые функции беспорядка, кажется, работают (например, установка цвета сцены или установка позиции актера) из отдельного потока. Что-то не так с моим кодом?

#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;
}
6
задан verb-sap 12 October 2010 в 07:26
поделиться