मैं क्यूटी में एक बहुप्रचारित आवेदन लिख रहा हूं (अपने स्वयं के ईवेंट लूप के साथ कई धागे)। लॉगिंग करते समय मैं लॉगजर को लॉग में एक थ्रेड आईडी (उनके सार्थक नाम) शामिल करना चाहता हूं। क्यूटी डिफ़ॉल्ट लॉगर ऐसा करने में असमर्थ लगता है। तो मैं तीन विकल्प हैं:एक लॉगर के लिए एक अलग धागा बना रहा है ठीक है?
- हर धागा अपने आप में प्रवेश करने देता है (इस mutexes शामिल है, इसलिए शायद सबसे खराब दृष्टिकोण है, लेकिन मुझे यकीन है कि नहीं कर रहा हूँ)
- एक समर्पित लकड़हारा धागा और अन्य नहीं है धागे सीधे 2. के रूप में (शायद तेजी से 3. से) घटनाओं पोस्ट इसे में
- ही लेकिन संदेश संकेत/स्लॉट प्रणाली के माध्यम से भेजा जाता है (वास्तव में, यह एक घटना के रूप में अच्छी पोस्टिंग में परिणाम होगा) ।
कौन सा बेहतर है और सामान्य रूप से इसे करने के सर्वोत्तम अभ्यास क्या हैं?
कुछ बातें टिप्पणी में सवाल के बाद स्पष्ट करने के लिए:
- QThread एक मानक पद्धति
postEvent()
है, कि धागे-सुरक्षित है।
तो सवाल बन जाता है, लकड़हारा धागा कतार
- किसी प्रकार का सार है कि भर में घटना के डेटा प्रमुखता की लागत का औचित्य साबित करने घटना प्रति काफी काम करने की आवश्यकता है सवाल का मुझे पता है कि सबसे अच्छा जवाब "उपाय!" है, लेकिन वर्तमान में ऐप प्रारंभिक विकास चरण में है, मापने के लिए बहुत कुछ नहीं है। शुरुआत से ही सही डिजाइन चुनना हमेशा अच्छा होता है।
- मेरे मामले में धागे शायद एक अच्छा विचार है: यह एक मीडिया प्लेयर है, इसलिए जीयूआई थ्रेड, प्लेबैक थ्रेड, डीबी/मीडिया लाइब्रेरी थ्रेड, नेटवर्क थ्रेड पूल ... दूसरे शब्दों में धागे का पूरा चिड़ियाघर है।
कुछ स्तर पर, सभी मामलों में सिंक्रनाइज़ेशन की आवश्यकता होती है (यानी म्यूटेक्स)। तो सवाल बन जाता है, क्या लॉगर थ्रेड को प्रति घटना पर्याप्त काम करने की आवश्यकता होती है ताकि किसी भी प्रकार की कतार में ईवेंट के डेटा को मार्शल करने की लागत को उचित ठहराया जा सके, केवल इवेंट स्रोत थ्रेड पर काम करने के दौरान, और घटना को लिखने के लिए काफी देर तक लॉक करना आम उत्पादन के लिए डेटा। – nate
आपको शायद एक समर्पित लॉगिंग थ्रेड के लिए सिंक्रनाइज़ेशन की आवश्यकता होगी (अंतर्निहित हो सकता है, लेकिन अन्य धागे की घटनाओं या पोस्ट कहीं भी कतारबद्ध हैं, जिन्हें सिंक्रनाइज़ किया जाना चाहिए)। –
@JesperJuhl गैर-समानांतर लॉगिंग रन टाइम व्यवहार को बदलता है, शायद बहुत अधिक (उदाहरण के लिए जब उच्च व्यवहार स्तर कुछ व्यवहार को डिबग करने के लिए चालू होता है जो तब गायब हो जाता है)। क्योंकि एक समर्पित लॉगिंग थ्रेड के बिना आपको लॉग इन एंट्री लिखते समय * अन्य थ्रेड को पूरे समय लॉगिंग से अवरुद्ध करना होगा *, या गन्दा इंटरमीस्ड लॉग स्वीकार करना होगा, जो जल्दी बेकार हो जाता है। –