मैं एक अतिरिक्त थ्रेड से अव्यवस्था फ़ंक्शन को कॉल करने के लिए संघर्ष कर रहा हूं। मैं थ्रेडिंग और क्लटर लाइब्रेरी 1.0 के लिए boost :: thread का उपयोग करता हूं।सी ++ - क्लटर 1.0 - थ्रेड से कॉलिंग फ़ंक्शन segfault
विशिष्ट होने के लिए, थ्रेड में एक लूप फ़ंक्शन होता है जो बूस्ट :: सिग्नल 2 :: सिग्नल उत्सर्जित करता है x और y के पैरामीटर के साथ सिग्नल कुछ समय में समन्वय करता है। यही संकेत एक समारोह से जुड़ा है कि हाथ अव्यवस्था है, यानी एक्स, वाई के लिए उन चर
clutter_stage_get_actor_at_pos (CLUTTER_STAGE (अभिनेता), CLUTTER_PICK_ALL, एक्स, वाई) में;
और यही वह जगह है जहां मुझे एक सीगफॉल्ट मिलता है।
स्पष्ट रूप से अव्यवस्था में कुछ थ्रेड-हैंडलिंग दिनचर्या हैं। मैंने
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;
}
बूस्ट :: थ्रेड के बजाय pthread का उपयोग करने के लिए अपना कोड बदलें क्योंकि आप किसी भी बूस्ट जादू का उपयोग नहीं कर रहे हैं और यहां अधिकांश लोगों ने इसे इंस्टॉल नहीं किया है। – karlphillip