[与this question相关]
我写这段代码是为了理解qt信号和槽是如何工作的。我需要有人来解释这种行为,并告诉我自己的结论是否正确。
我的程序:
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();
}
现在,运行此程序会将其送入无限循环以寻找新连接。
观察:
如果我不调用 app.exec()
,程序会立即返回(它应该如此)。
问题:
为什么?
问题:
如果我将插槽连接为排队连接,什么时候执行插槽调用?
问题:
如果 app.exec()
是无限循环,那么 newConnection()
信号是如何发出的?
大问题:
这里涉及他们的任何“第二线程”吗? (我期待一个否定的,一个非常优雅的解释:))
谢谢,
jrh
PS:还有谁有这种嵌套括号综合症?比如“(.. :))”或“(.. (..))”?
最佳答案
如果您不调用 app.exec(),那么程序会到达您的 main() 的末尾并结束。 (为什么?没有更多的代码可以执行!)
app.exec() 是以下样式的无限循环:
do
{
get event from system
handle event
}
while (true);
如果您使用排队连接,那么该事件将被添加到您的事件队列中,并且它将在 app.exec() 循环期间的某个时间点执行。
您的程序中没有第二个线程。事件由操作系统异步传递,这就是为什么看起来还有其他事情发生的原因。有,但不在您的程序中。
关于c++ - Qt 信号和槽、线程、app.exec() 和相关查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1472123/