Я борюсь с вызовом функции беспорядка из дополнительного потока.
Я использую Boost :: Thread для многопоточности и библиотеки беспорядка 1.0.
Если быть точным, поток содержит зацикленную функцию, которая испускает boost :: signal2 :: signal с параметрами координат x и y, время от времени.
Этот сигнал связан с функцией, которая передает эти переменные в беспорядок, т. Е. X, y в
clutter_stage_get_actor_at_pos (CLUTTER_STAGE (актер),
CLUTTER_PICK_ALL, x, y);
И вот где я получаю сегфо.
Очевидно, что в беспорядке есть несколько процедур обработки потоков. Я пытался позвонить
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);
* +1025 * 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;
}