Qt, Signale und slots, threads, app.exec () und Verwandte Abfragen
[im Zusammenhang mit der diese Frage]
Schrieb ich dieses Stück code zu verstehen, wie qt, Signale und slots arbeiten. Ich brauche jemanden, um zu erklären, das Verhalten, und mir zu sagen, wenn ich im Recht bin, über meine eigenen Schlussfolgerungen.
Mein Programm:
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();
}
Nun, die Ausführung dieses Programms sendet Sie in einer Endlosschleife auf der Suche nach neuen verbindungen.
Observation:
wenn ich nicht anrufen app.exec()
, das Programm liefert sofort (wie es sollte).
Question:
warum?
Question:
wenn ich verbunden die Spielautomat in einer Warteschlange Verbindung, wenn die slot-Aufruf durchgeführt werden?
Question:
wenn app.exec()
ist eine unendliche Schleife der Art, wie der newConnection()
signal jemals emittiert?
Big Question:
Ist, deren jeder "zweiten thread" hier beteiligt? (Ich erwarte keine, und eine erstaunlich elegante Erklärung 🙂 )
Dank,
jrh
PS: wer hat sonst noch dieses verschachtelte Klammern-Syndrom? wie "(.. :))" oder "(.. (..))"?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie don ' T call app.exec (), dann wird das Programm trifft das Ende deiner main() endet. (Warum? Es ist nicht mehr code ausführen!)
app.exec() ist eine Endlosschleife, die folgenden Stil:
Wenn Sie eine Verbindung in der Warteschlange, dann ist das event Hinzugefügt, um Ihr event, queue, und es wird durchgeführt an einem gewissen Punkt in der Zukunft, während Sie die app.exec () - Schleife.
Gibt es keinen zweiten thread in Ihrem Programm. Ereignisse geliefert werden asynchron vom Betriebssystem, das ist, warum es scheint, dass es noch etwas anderes. Gibt es, aber nicht in Ihrem Programm.
newConnection()
signal immer ausgegeben, wenn die main-loop ist busy waiting in dieser Schleife?app.exec()
tritt in die Haupt-event-Schleife und wartet, bisexit()
genannt wird.update:
Die main event loop und die glue-code generiert qmake kümmern sich um die übertragung der Ereignis-Meldung vom
QTcpServer
zu IhremConnectionHandler
.Wenn Sie möchten, verwenden Sie in der Warteschlange verbindungen, die die eigentliche Verbindung zu den
QTcpServers
slot würden verzögert werden, bis die Haupt-event-Schleife liefert die Verbindungsanforderung.Wenn Sie sagen, es gibt eine unendliche Schleife, du meinst das Programm stürzt ab?
Weil listen() wird ein Teil der Haupt-Anwendung-Ereignis-Schleife der Art und Weise Sie es eingerichtet haben, die läuft, bis Sie das Programm beenden. Ich bin mir nicht sicher, was das problem ist. Es sollte keine Mühe, Ihre signal emittiert werden, in die Haupt-Anwendung-Ereignis-Schleife (exec ()), immer wenn einer gefunden wird.
Wenn Sie möchten, können Sie Ihre ConnectionHandler-Klasse erweitern QThread und führen listen() in einem eigenen thread, abgesehen von der Haupt-Applikation Schleife.