2009-09-24 8 views
7
[ this questionに関連】

Qtのシグナルとスロット、スレッド、(app.exec)、および関連するクエリ

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

、Rこのプログラムを作成すると、新しい接続を探す無限ループにそれを送ります。

Observation:私がapp.exec()に電話をしていないと、プログラムはすぐに(必要に応じて)戻ります。
Question:なぜですか?

Question:スロットを待ち接続として接続していた場合、スロットの呼び出しはいつ実行されますか?
Question:app.exec()が無限ループの場合、newConnection()シグナルはどのように放出されますか?

Big Question:これらの「第2のスレッド」はここに含まれていますか?このネストされた括弧症候群を持っている他:

おかげで、
JRH

PSを(私は:)がない、と驚くほどエレガントな説明を期待して)? "(.. :))"や "(..(..))"のように?

答えて

11

app.exec()を呼び出さないと、プログラムはmain()の最後にヒットして終了します。 (?!なぜ実行するためにこれ以上のコードがありません)

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

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

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

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

+0

メインイベントループがシステムからイベントを取得するのに忙しい場合、誰がそれらを生成していますか?このループでメインループがビジー状態であれば、 'newConnection()'シグナルはどのように放出されますか? – jrharshath

+0

@ harshath.jr - 以前はQTcpServerを使用していませんでしたが、ドキュメンテーションから、OSにプログラムにTcpイベントを配信するように頼んでいるようです。プログラムがそのtcpイベントを処理すると、QTcpServerは必要な処理を行い、newConnection()を発行します。 – Bill

0

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

更新:
qmakeはによって生成されたメインイベントループとグルーコードは、あなたのConnectionHandlerQTcpServerからイベントメッセージを転送するの世話をします。

QTcpServersスロットへの実際の接続は、メインイベントループが接続要求をに送信するまで遅延します。

0

無限ループに入ると、プログラムがクラッシュすることになりますか?

listen()はメインアプリケーションイベントループの一部になります。つまり、プログラムを終了するまで実行されます。私は問題が何であるか分かりません。メインアプリケーションイベントループ(exec())が発生するたびにシグナルが放出されるという問題はありません。

もしあなたが好きなら、あなたのConnectionHandlerクラスはQThreadを拡張してメインのアプリケーションループとは別に独自のスレッドでlisten()を実行できます。

関連する問題