我正在尝试从额外的线程中调用clutter函数,但遇到了困难。使用了boost::thread进行线程处理和clutter库1.0。
具体来说,该线程包含一个循环函数,定期发出带有x和y坐标参数的boost::signals2::signal。该信号连接到一个函数,将这些变量传递给clutter,即在以下代码中的x,y:
clutter_stage_get_actor_at_pos(CLUTTER_STAGE(actor), CLUTTER_PICK_ALL, x, y);
但是我遇到了段错误(segfault)。
显然,clutter有一些线程处理例程。我尝试在启动clutter_main()之前调用:
g_thread_init(NULL);
clutter_threads_init();
我还尝试使用以下代码包装clutter函数:
clutter_threads_enter();
clutter_stage_get_actor_at_pos(CLUTTER_STAGE(actor), CLUTTER_PICK_ALL, x, y);
clutter_threads_leave();
但这也没有解决问题。
非常感谢任何提示!
补充说明
我已经创建了一个最小化的样例来展示我的问题。我已经按照建议对clutter_main()例程进行了“保护”。似乎可以从独立线程中使用clutter的某些函数(例如设置stage颜色或actor位置)。但我的代码仍然存在问题吗?
#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;
}