[związane this question]Qt sygnały i gniazda, wątki, app.exec() i związane z nimi pytania
Napisałem ten kawałek kodu, aby zrozumieć, w jaki sposób qt sygnały i gniazda pracować. Potrzebuję kogoś, kto wyjaśni to zachowanie i powie mi, czy mam rację co do własnych wniosków.
Mój program:
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();
}
Teraz, r unning ten program wysyła go do nieskończonej pętli szukającej nowych połączeń.
Observation:
jeśli nie zadzwonię pod numer app.exec()
, program natychmiast powróci (tak jak powinien).
Question:
dlaczego?
Question:
czy połączyłem gniazdo jako połączenie oczekujące w kolejce, kiedy przeprowadzane jest wywoływanie automatów?
Question:
jeśli app.exec()
jest nieskończoną pętlą sortów, w jaki sposób sygnał newConnection()
zostanie wyemitowany?
Big Question:
Czy ma tu miejsce jakikolwiek "drugi wątek"? (I nie oczekiwać i nadzwyczaj eleganckie wyjaśnienie :))
Dzięki,
jrh
PS: Kto jeszcze ma ten zespół zagnieżdżone nawias? jak "(.. :))" lub "(.. (..))"?
nadal pozostaje jedna rzecz: jeśli główna pętla zdarzeń jest zajęta uzyskiwaniem zdarzeń z systemu, kto je generuje? w jaki sposób emitowany jest sygnał 'newConnection()', jeśli główna pętla jest zajęta oczekiwaniem w tej pętli? – jrharshath
@ harshath.jr - Nie używałem QTcpServer wcześniej, ale z dokumentacji wygląda na to, że prosi OS o dostarczenie zdarzeń Tcp do twojego programu. Kiedy twój program przetwarza zdarzenie tcp, QTcpServer robi to, czego potrzebuje, a następnie emituje newConnection(). – Bill