c++ - Qt 信号和槽、线程、app.exec() 和相关查询

标签 c++ qt signals-slots

[与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/

相关文章:

c++ - QByteArray 转换和指针转换

c++ - QByteArray 的外部与内部声明

c++ - 如何将抽象信号连接到接口(interface)构造函数中的插槽?

c++ - OpenGL ES 绘图形状

c++ - 使用自己的类名来解析推断上下文中的类型

qt - 获取Qt 4.8 SDK

c++ - 带有默认参数的 Qt 插槽

c++ - QT5 单选按钮信号与功能不兼容,即使它应该是

c++ - 如何使用带有 C++ 的 opencv 库将下图中的黑色像素更改为红色像素

c++ - 在条件中评估字符串