2015-01-15 10 views
6

मैंने एक क्यूटी-आधारित नेटवर्क लाइब्रेरी बनाई है जो कि क्यूटी इवेंट लूप नहीं चला रहे हैं, और जो अन्यथा क्यूटी अनुप्रयोग नहीं हैं। यह Is it possible to create local event loops without calling QApplication::exec()?चेतावनी दबाएं "QAplplication मुख्य() थ्रेड में नहीं बनाया गया था"

यह पूरी तरह से काम करता है से प्रति जवाब एक सूत्र में एक QCoreApplication उदाहरण बनाकर संभव बनाया गया है, लेकिन यह क्यूटी परेशान (मुझे लगता है यह चिंता है कि मैं मुख्य थ्रेड के बाहर एक जीयूआई में हेरफेर करने की कोशिश करेंगे बनाता है काम नहीं करेगा, लेकिन मैं नहीं हूं), और इसलिए यह एक चेतावनी प्रिंट करता है: WARNING: QApplication was not created in main() thread

मैं उस चेतावनी को दबाना चाहता हूं जो अन्यथा एक्स 11 कंसोल पर मुद्रित होगा और अधिकतर मेरे उपयोगकर्ताओं को अनावश्यक कमियों का एक गुच्छा दर्ज करने का कारण बनता है। हालांकि, मैं केवल को त्रुटि का समाधान करना चाहता हूं, क्योंकि मैं कुछ वैध उद्देश्यों के लिए qDebug का उपयोग करता हूं और भविष्य की चेतावनियां देखना चाहता हूं। ऐसा करने का कोई तरीका है, जैसे किसी प्रकार का क्यूटी #pragma?

संपादित करें:

ऐसा ही एक सवाल यहाँ से पहले कहा गया था: Qt console application "WARNING: QApplication was not created in the main() thread", लेकिन इस सवाल का जवाब चेतावनी को दबाने के लिए किसी भी सार्थक विचारों के बिना सिर्फ एक कोड की समीक्षा मूल रूप से किया गया था।

+1

मुझे लगता है कि समस्या उत्पन्न होती है क्योंकि आप QApplication बनाने से पहले क्यूटी एपीआई (मुख्य धागे में, या केवल * कुछ * धागे में) को छू रहे हैं। आप ऐसा नहीं कर सकते (मॉड्यूल सामग्री जो QAplication से पहले की जानी चाहिए)। विशेष रूप से, आप QObjects बना रहे हैं। – peppe

+0

हम्म, जो एक दिलचस्प चिकन-अंडे की समस्या पैदा करता है, क्योंकि कक्षा जिसे मैं 'क्यूकोर एप्प्लिकेशन' थ्रेड बनाने के लिए उपयोग करता हूं वह स्वयं ही 'क्यूओब्जेक्ट' है क्योंकि इसे बाल धागे में सॉकेट के साथ संवाद करने के लिए सिग्नल का उपयोग करने की आवश्यकता होती है। –

+1

ठीक है, बस इसे विभाजित करें? उस कक्षा को तर्क के साथ रखें, और एक और वर्ग बनाएं जो QCoreAplication और आपकी कक्षा का ऑब्जेक्ट बनाता है। – peppe

उत्तर

8

समस्या उत्पन्न होती है क्योंकि आप QApplication बनाने से पहले Qt API (मुख्य धागे में, या केवल कुछ थ्रेड) को स्पर्श कर रहे हैं। आप ऐसा नहीं कर सकते विशेष रूप से, आप किसी प्रकार के का क्यूओब्जेक्ट बना रहे हैं, जो कि क्यूटी में कहीं भी सेट कर रहा है जिसे क्यूटी को main थ्रेड के रूप में माना जाना चाहिए।

QApplication बनाने से पहले उपयोग करने के लिए आपको केवल एक ही क्यूटी एपीआई हैं जिन्हें स्पष्ट रूप से उस परिदृश्य में सुरक्षित होने के लिए दस्तावेज किया गया है।

तो: ऐसा मत करो। पहली चीज़ के रूप में QCoreAplication का निर्माण करें, तो आप जाने के लिए स्वतंत्र हैं।

+0

इस फ़ॉर्म में मेरे कोड को दोबारा प्रतिक्रिया देने से विभिन्न धागे में वस्तुओं के बीच कनेक्शन के साथ बहुत सारे अजीब और अड़चन मुद्दों को हल किया गया। मैं निश्चित रूप से इस चेतावनी को फिर से अनदेखा नहीं करूँगा। –

संबंधित मुद्दे