余分なスレッドからクラッター関数を呼び出すのに苦労しています。スレッド化にはboost::threadを使用し、クラッターライブラリ1.0を使用しています。
具体的には、スレッドには x 座標と y 座標のパラメーターを使用して boost::signals2::signal を時々発行するループ関数が含まれています。その信号は、これらの変数を乱雑に渡す関数に接続されています。つまり、x、y in
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);
clutter_threads_leave();
しかし、それもうまくいきません..
すべてのヒントをいただければ幸いです。よろしくお願いします。
補遺
私がやろうとしていることの最小限のサンプルを偽造しただけです。提案されているように、 clutter_main() ルーチンを既に「保護」しています。clutter の一部の機能 (ステージの色の設定や俳優の位置の設定など) は、別のスレッドから動作しているようです。私のコードにまだ何か問題がありますか?
#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;
}