2010-01-15 10 views
10

पर क्यूटी सिग्नल उत्सर्जित करें मैं एक गैर Qt थ्रेड से emit signal1() पर कॉल कर रहा हूं। गैर क्यूटी थ्रेड द्वारा मेरा मतलब जीयूआई इवेंट लूप से नहीं है और किसी भी QThread रन() विधि या किसी QThread स्वयं ईवेंट लूप से नहीं है।गैर क्यूटी थ्रेड या यूसाइड क्यूटी मुख्य घटना लूप से 4.5

यह केवल एक pthread (pthread_create()) है जो QObject की एक विधि को कॉल करता है जो संकेतों को उत्सर्जित करता है।

पूर्व:

MyQbject: public QObject 
{ 
... 
void emitBunchOfSignals() 
{ 
emit signal1(); 
emit signal2(); 
... 
} 
... 
} 

मेरी pthread की "रन" विधि है जो एक MyObject उदाहरण के लिए सूचक (उदाहरण के मुख्य क्यूटी जीयूआई धागा संदर्भ नहीं pthread भीतर बनाया गया था कि) है emitBunchOfSignals() तरीकों कहता है।

क्यूटी 4.5 से पहले जो बुरा था। अब, क्यूटी 4.5 इसे संभालता है? क्या यह qApp->PostEvent() या कुछ ऐसा है जो सिग्नल जीयूआई थ्रेड (और इस प्रकार स्लॉट भी) के भीतर सिग्नल उत्सर्जित होता है?

धन्यवाद

+0

जब आप कनेक्ट करते हैं, तो आप स्पष्ट रूप से प्रकार को कतारबद्ध कनेक्शन सेट कर सकते हैं। –

+0

उस समय आपको इस प्रश्न को लिखने के लिए लिया गया था, तो आप केवल कोड खोला और खुद को ढूंढ सकते थे। – shoosh

+0

यह सीधे आगे नहीं लगता है क्योंकि यह Qt 3.xx के साथ क्रैश होता था। मैं कनेक्ट विकल्प (directconnection queuedconnection आदि) से परिचित हूं लेकिन मैंने सोचा कि यह केवल QTreads के बीच या QThread और मुख्य ईवेंट लूप के बीच काम करता है। यह क्यूटी 3.xx के साथ दुर्घटनाग्रस्त क्यों होता था कम से कम कोड को देखकर समझने के लिए सीधे आगे नहीं था। मैं पागल हो रहा हूँ ? –

उत्तर

8

क्या आप सुनिश्चित करने की आवश्यकता है कि आप क्यूटी autmatically का अनुमान नहीं लगा सकता है, क्योंकि जो वस्तु हैं कि जो धागा करने के लिए ("धागा आत्मीयता" में प्रयोग किया जाता है, धागे से एक करने के लिए एक पंक्तिबद्ध कनेक्शन का उपयोग है प्रलेखन)। जब जोड़ने आप ऐसा करते हैं:

connect(src, SIGNAL(signal-signature), dest, SLOT(slot-signature), Qt::QueuedConnection); 

यही संकेत में परिणाम होगा गंतव्य की घटना पाश पर डाल दिया जा रहा है, और जब इसकी धागा (अर्थात अपने घटना पाश) चल रहा है स्लॉट बुलाया जा रहा है।

+3

बहुत बहुत धन्यवाद। यह सुनिश्चित करने के लिए कि मैं समझता हूं कि आपका क्या मतलब है: चूंकि मेरा उत्सर्जन QObject QThread से संबंधित नहीं है और न ही मुख्य क्यूटी जीयूआई थ्रेड (यह वास्तव में मेरे कोर्बा धागे से संबंधित है), क्यूटी थ्रेड एफ़िनिटी को समझ नहीं सकता है। इस प्रकार मुझे QueuedConnection से कनेक्शन को मजबूर करना होगा क्योंकि स्वचालित कनेक्शन इस विशिष्ट मामले में काम नहीं करेगा। हालांकि जब उत्सर्जन QObject QThread से संबंधित होता है, तो क्यूटी थ्रेड एफ़िनिटी को समझ सकता है और एक स्वचालित कनेक्शन कनेक्शन रिसीवर QObject थ्रेड के इवेंट लूप को आवश्यक पोस्ट करेगा। –

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