8

この質問に関連】

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();
}

このプログラムを実行すると、新しい接続を探す無限ループに陥ります。

Observation:を呼び出さないとapp.exec()、プログラムはすぐに戻ります (そうあるべきです)。
Question:なぜ?

Question:スロットをキュー接続として接続した場合、スロット呼び出しはいつ実行されますか?
Question:ある種の無限ループの場合app.exec()、信号はどのようnewConnection()に放出されるのでしょうか?

Big Question:彼らの「2番目のスレッド」はここに関係していますか? (いいえ、そして驚くほどエレガントな説明を期待しています:))

ありがとう、
ジュニア

PS: このネストされた括弧症候群を持っている人は他にいますか? 「(.. :))」または「(.. (..))」のように?

4

3 に答える 3

12

app.exec() を呼び出さない場合、プログラムは main() の終わりに到達して終了します。(なぜですか? 実行するコードがもうありません!)

app.exec() は、次のスタイルの無限ループです。

do
{
  get event from system
  handle event
}
while (true);

キュー接続を使用する場合、イベントはイベント キューに追加され、 app.exec() ループ中の将来のある時点で実行されます。

プログラムに 2 番目のスレッドはありません。イベントは OS によって非同期に配信されるため、何か他のことが起こっているように見えます。ありますが、プログラムにはありません。

于 2009-09-24T15:52:03.200 に答える
0

あなたがそれが無限ループに入ると言うとき、それはそれがプログラムをクラッシュさせることを意味しますか?

listen()は、プログラムを終了するまで実行される、設定した方法でメインアプリケーションイベントループの一部になるためです。何が問題なのかわかりません。メインアプリケーションのイベントループ(exec())でシグナルが発生するたびに、問題が発生することはありません。

必要に応じて、ConnectionHandlerクラスでQThreadを拡張し、メインのアプリケーションループとは別に、独自のスレッドでlisten()を実行することができます。

于 2009-09-24T15:05:46.350 に答える
0

app.exec()exit()メインイベントループに入り、が呼び出されるまで待機します。

更新:
メインイベントループとqmakeによって生成されたグルーコードは、からへのイベントメッセージの転送を処理QTcpServerしますConnectionHandler

キューに入れられた接続を使用する場合、スロットへの実際の接続は、メインイベントループが接続要求をQTcpServers配信するまで遅延されます。

于 2009-09-24T14:49:55.017 に答える