c – Qt信号和插槽,线程,app.exec()和相关查询

[与 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&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...