2012-02-23 12 views
7

में स्थैतिक वर्ग विधि से सिग्नल भेजना मैं एक स्थिर कॉलबैक फ़ंक्शन को कोड करने का प्रयास कर रहा हूं जिसे एक ही कक्षा के भीतर एक और स्थिर फ़ंक्शन से अक्सर कहा जाता है। मेरे कॉलबैक फ़ंक्शन को emit सिग्नल की आवश्यकता है लेकिन किसी कारण से यह बस ऐसा करने में विफल रहता है। मैंने इसे डीबगर के तहत रखा है और slot कभी नहीं बुलाया जाता है। हालांकि जब मैं कोड डालता हूं तो मैं emit पर एक गैर स्थैतिक फ़ंक्शन में डेटा करता था जो यह काम करता है। क्या कोई कारण है कि मैं स्थिर कार्य से सिग्नल उत्सर्जित नहीं कर सकता? मैंने कक्षा का एक नया उदाहरण घोषित करने और उत्सर्जन समारोह को बुलाए जाने की कोशिश की है लेकिन बिना किसी किस्मत के।क्यूटी

class Foo 
{ 
signals: 
    emitFunction(int); 
private: 
    static int callback(int val) 
    { 
     /* Called multiple times (100+) */ 
     Foo *foo = new Foo; 
     foo.emitFunction(val); 
    } 
    void run() 
    { 
     callback(percentdownloaded); 
    } 
}; 

मैंने कुछ बुनियादी कोड पोस्ट किया है जो दर्शाता है कि मैं क्या करने का प्रयास कर रहा हूं। मैं अनुरोध पर पूरा कोड पोस्ट करूंगा।

संपादित करें: मैं पूर्ण कोड पोस्ट कर रहा हूं क्योंकि यह एक अजीब परिदृश्य है। http://pastebin.com/6J2D2hnM

+1

से 2. स्थिर सीबी समारोह, लोड emitFunction में आप कहाँ सिग्नल और स्लॉट कनेक्ट होने के लिए है? – Nobody

+0

मैं उन्हें एक अलग '.cpp' फ़ाइल में कनेक्ट करता हूं जिसे बटन दबाया जाता है। 'शून्य मुख्यविंडो :: on_pushButton_clicked() { tProc = नया फू (यह); कनेक्ट (टीप्रोक, सिग्नल (वैलचैंगेड (इंट)), यह, एसएलओटी (ऑनम्बरम्बर (इंट))); tProc-> प्रारंभ(); } 'फिर यह मेरे' फू 'वर्ग का एक नया उदाहरण बनाता है और कॉलबैक फ़ंक्शन को कॉल करने वाले थ्रेड को प्रारंभ करता है। – user99545

+0

अपने स्थिर कॉलबैक फ़ंक्शन में आप एक नया Foo इंस्टेंस बनाते हैं और उस पर सिग्नल कॉल करते हैं। मुझे लगता है कि यह वह बिंदु है जहां आप सिग्नल को उत्सर्जित करना चाहते हैं। आप इस उदाहरण को उस स्लॉट से कैसे कनेक्ट करते हैं जिसे आप संबोधित करना चाहते हैं? – Nobody

उत्तर

10

यह काम नहीं करेगा, क्योंकि जब भी आप उस स्थिर कार्य में प्रवेश करते हैं तो आप एक नया फू बना रहे हैं, और आप एक स्लॉट पर सिग्नल कनेक्ट नहीं करते हैं।

तो, ठीक है कि कार्य करने के लिए वस्तु पारित करने के लिए होगा:

class Foo 
{ 
signals: 
    emitFunction(int); 
private: 
    static int callback(int val, Foo &foo) 
    { 
     /* Called multiple times (100+) */ 
     foo.emitFunction(val); 
    } 
    void run() 
    { 
     callback(percentdownloaded, *this); 
    } 
}; 

एक अन्य विकल्प postEvent उपयोग करने के लिए है, लेकिन मैं यह सिफारिश नहीं होगा।


जब से तुम कॉलबैक के हस्ताक्षर संशोधित नहीं कर सकते, तो आप इसे इस तरह से कर सकते हैं:

class Foo 
{ 
signals: 
    emitFunction(int); 
private: 
    static int callback(int val) 
    { 
     /* Called multiple times (100+) */ 
     theFoo->emitFunction(val); 
    } 
    static Foo *theFoo; 
    void run() 
    { 
     callback(percentdownloaded, *this); 
    } 
}; 

लेकिन आप कहीं है कि स्थिर चर को प्रारंभ करना होगा।

+0

यह काम करेगा, लेकिन समस्या यह है कि मेरा स्थिर कॉलबैक फ़ंक्शन किसी अन्य फ़ंक्शन द्वारा कहा जा रहा है जो libCURL लाइब्रेरी से है और मैं इसके लिए तर्क नहीं दे सकता। मुझे यकीन नहीं है कि इस मामले में अपनी विधि को कैसे कार्यान्वित किया जाए। – user99545

+1

@ user99545 ​​एक स्थिर चर जोड़ें, जो कॉलबैक में उपयोग किया जाता है। मैं उत्तर –

+0

उत्तर संपादित कर दूंगा। मैंने आपके स्थिर चर का उपयोग करके समाप्त किया और थ्रेड के पैरामीटर के रूप में वर्तमान क्लास इंस्टेंस को पास करके इसे प्रारंभ किया। मैंने वर्ग को प्रारंभ करने के लिए उस पैरामीटर का उपयोग किया और यह काम किया। – user99545

0

आपको इसे काम करने के लिए कक्षा के उदाहरण के लिए एक सूचक प्रदान करना होगा।

नोटिस हालांकि सामान्य रूप से इसे स्थिर कार्यों से संकेतों को उत्सर्जित करने की सलाह नहीं दी जाती है। स्टेटिक फ़ंक्शंस को क्लास का उदाहरण बनाये बिना बुलाया जा सकता है, जिसका अर्थ है कि (यदि आप प्रेषक को तर्क के रूप में प्रदान नहीं करते हैं और इसे स्पष्ट रूप से उपयोग करते हैं), तो आपके पास उत्सर्जित संकेतों के लिए "प्रेषक" ऑब्जेक्ट नहीं होगा।

इन मामलों के लिए Lol4t0 सुझाव देता है कि मैं कॉलबैक भी पसंद करता हूं।

2

अगर किसी को अभी भी समाधान मिल रहा है, तो मैंने यह किया है, यह मेरी परियोजना में काम करता है। 1. अपने वर्ग एक सिंगलटन अपने सिंगलटन वर्ग

static int callback(int val) 
    { 
    /* Called multiple times (100+) */ 
    MYClass::getInstance()->emitFunction(val); 
    } 
+0

अच्छा दृष्टिकोण और सरल, सिग्नल उत्सर्जन के बाद भी यह थ्रेड सुरक्षित है। +1 – g24l