2009-09-24 14 views
7

[this question से संबंधित]क्यूटी संकेतों और स्लॉट्स, धागे, app.exec(), और संबंधित प्रश्नों

मैं कोड के इस टुकड़े लिखा समझने के लिए क्यूटी संकेतों और स्लॉट काम करते हैं। मुझे व्यवहार की व्याख्या करने के लिए किसी की जरूरत है, और मुझे यह बताने के लिए कि क्या मैं अपने निष्कर्षों के बारे में सही हूं।

मेरे कार्यक्रम:

connectionhandler.h

#ifndef CONNECTIONHANDLER_H 
#define CONNECTIONHANDLER_H 

#include <QTcpServer> 
class ConnectionHandler : public QObject 
{ 
    Q_OBJECT 
public: 
    ConnectionHandler(); 
public slots: 
    void newConn(); 
private: 
    QTcpServer *server; 
}; 

#endif // CONNECTIONHANDLER_H 

connectionhandler.cpp

#include "connectionhandler.h" 
#include <QTextStream> 

ConnectionHandler::ConnectionHandler() { 
    server = new QTcpServer; 
    server->listen(QHostAddress::LocalHost, 8080); 
    QObject::connect(server, SIGNAL(newConnection()),this, SLOT(newConn())); 
} 
void ConnectionHandler::newConn() { 
    QTextStream out(stdout); 
    out << "new kanneksan!\n"; 
    out.flush(); 
} 

main.cpp

#include <QCoreApplication> 
#include "connectionhandler.h" 

int main(int argc, char* argv[]) { 
    QCoreApplication app(argc,argv); 
    ConnectionHandler handler; 
    return app.exec(); 
} 

अब, आर इस कार्यक्रम को अनन्य करने से यह नए कनेक्शन की तलाश में एक अनंत लूप में भेजता है।

Observation: यदि मैं app.exec() पर कॉल नहीं करता हूं, तो प्रोग्राम तुरंत लौटाता है (जैसा कि यह होना चाहिए)।
Question: क्यों?

Question: यदि मैंने स्लॉट को कतारबद्ध कनेक्शन के रूप में जोड़ा था, तो स्लॉट आमंत्रण कब किया जाएगा?
Question: यदि app.exec() एक अनंत लूप है, तो newConnection() सिग्नल कभी भी उत्सर्जित हो जाता है?

Big Question: क्या उनके यहां कोई दूसरा "दूसरा धागा" शामिल है? (मैं एक नहीं है, और एक stunningly सुंदर व्याख्या की उम्मीद :))

धन्यवाद,
jrh

पुनश्च: किसकी इस नेस्टेड कोष्टक सिंड्रोम है? जैसे "(.. :))" या "(.. (..))"?

उत्तर

11

यदि आप app.exec() को कॉल नहीं करते हैं तो प्रोग्राम आपके मुख्य() और सिरों के अंत में हिट करता है। (क्यों वहाँ निष्पादित करने के लिए कोई और अधिक कोड है!)

app.exec() निम्नलिखित शैली का एक अनंत लूप है:

do 
{ 
    get event from system 
    handle event 
} 
while (true); 

आप एक पंक्तिबद्ध कनेक्शन का उपयोग करते हैं, तो घटना में जोड़ा जाता है आपके घटना कतार, और यह app.exec() लूप के दौरान भविष्य में किसी बिंदु पर किया जाएगा।

आपके कार्यक्रम में कोई दूसरा धागा नहीं है। घटनाओं को ओएस द्वारा असीमित रूप से वितरित किया जाता है, यही कारण है कि ऐसा लगता है कि कुछ और चल रहा है। आपके कार्यक्रम में नहीं है, लेकिन नहीं।

+0

अभी भी एक बात बनी हुई है: यदि मुख्य घटना लूप सिस्टम से घटनाओं को व्यस्त करने में व्यस्त है, तो उन्हें कौन उत्पन्न कर रहा है? मुख्य लूप इस लूप में इंतजार कर रहा है, तो 'newConnection()' सिग्नल कभी उत्सर्जित कैसे होता है? – jrharshath

+0

@ harshath.jr - मैंने पहले QTcpServer का उपयोग नहीं किया है, लेकिन प्रलेखन से ऐसा लगता है कि यह आपके प्रोग्राम में टीसीपी घटनाओं को वितरित करने के लिए ओएस से पूछता है। जब आपका प्रोग्राम उस टीसीपी घटना को संसाधित करता है, तो QTcpServer जो करता है उसे करता है, फिर newConnection() को उत्सर्जित करता है। – Bill

0

app.exec() मुख्य ईवेंट लूप में प्रवेश करता है और exit() तक प्रतीक्षा करता है।

अद्यतन:
मुख्य समारोह पाश और अपने ConnectionHandler करने के लिए QTcpServer से घटना संदेश के हस्तांतरण की qmake देखभाल द्वारा उत्पन्न गोंद कोड।

आप कनेक्शन QTcpServers स्लॉट के लिए वास्तविक कनेक्शन पंक्तिबद्ध का उपयोग करते हैं देरी होगी जब तक मुख्य समारोह पाश कनेक्शन अनुरोध देता है।

0

जब आप कहते हैं कि यह एक अनंत लूप में प्रवेश करता है, तो आपका मतलब है कि यह प्रोग्राम को दुर्घटनाग्रस्त करता है?

क्योंकि सुनो() मुख्य एप्लिकेशन इवेंट लूप का हिस्सा बन जाएगा जिस तरह से आपने इसे स्थापित किया है, जो तब तक चलता है जब तक आप प्रोग्राम से बाहर नहीं जाते। मुझे यकीन नहीं है कि समस्या क्या है। जब भी किसी का सामना होता है तो मुख्य एप्लिकेशन इवेंट लूप (exec()) में आपके सिग्नल को उत्सर्जित करने में कोई समस्या नहीं होनी चाहिए।

यदि आप चाहें, तो आप अपने कनेक्शन हैंडलर क्लास QThread का विस्तार कर सकते हैं और मुख्य अनुप्रयोग लूप के अलावा, अपने स्वयं के धागे में सुनो() चला सकते हैं।

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