質問

明かしたいと思っています。QTcpServer作品の裏に関するスレッドとブロック. QTcpServerlisten() 法ヤをただちに復帰します。場合は聴を開始し、サーバは光信号を newConnection().私にはどのようにサーバーを聞きになること間違いなしの内のメインスレッド) listen() 法を返します。通常のコンソールを使用してアプリケーショQTcpServerうようになります:

//main.cpp
int main(int argc, char* argv[])
{
    QCoreApplication app;
    MyServer server;
    app.exec();
}

//MyServer.cpp
MyServer::MyServer(QObject *parent) : QObject(parent)
{
    this->server = new QTcpServer(this);
    connect(server, SIGNAL(newConnection()), this, SLOT(on_newConnection()));
    if (!server->listen(QHostAddress::Any, 1234))
        //do something in case of error
}
void MyServer::on_newConnection()
{
    QTcpSocket* socket = server->nextPendingConnection();
    //do some communication...
}

QTcpServer に依存し QCoreApplication (やっ QRunLoop 既に走る各ネットワークイベント。でも正常に動作しない QCoreApplication::exec() ている。

役に立ちましたか?

解決

って掘削を通じて、ソースコードの QtCoreQtNetwork モジュールです。

Aperantly, QTcpServer することのできるモード: 同期非同期.

同期 モードを呼び出した後 listen() 呼び出し側で通話 waitForNewConnection() るブロッキング方法(スレッドが眠るまで人に接続し、リスニング。このように QTcpServer 新しいスレッドなイベントループを実行します。

非同期 モード QTcpServer レーザの newConnection() 信号が接続されました。ができることが必要になりのイベントループruning.裏付、 QCoreApplicationQEventLoopQAbstractEventDispatcher (abstractクラスなので、コンクリートタイプに依存OSのは、例えば QEventDispatcherUNIX).このイベントディスパッチャを監視できる条件のためにソケッツ(代表されるファイル記述子).この方法 registerSocketNotifier(QSocketNotifier*).このメソッドが呼び出されるコンストラクタの QSocketNotifier クラスは、 QTcpServer のインスタンスを作成し、毎回 listen() が呼び出されます。のシステム呼び出したときに呼び出される QTcpServer::listen() 呼び出しはもちろん、 listen() るだけですぐに返すべてのマジックする場合に起こるイベントのループが起動します。イベントループを使用してディスパッチャ)のモニタがある場合は一定の状態のソケットとして登録されています。を呼び出し select() システムコールを受ける一つ以上のファイルデータによるカーネル)のための一定の条件がある場合には、データの読み込まれる場合、データを書き込むことができ、または、エラーが発生した場合).通話のできるブロックのスレッドまでの状態のソケット、または戻ることができるその後の時間経過の状況ソケットは打ち破られてしまいました。い場合はQtは呼び出し select() との待ち時間の提供の有無を無期限にブロック)であると考え決定した一部の複雑な方法を紹介します。それでその状態のソケットが満たされていないのイベントディスパッチャに通知します QSocketNotifier このソケット、それに貢献でに、当 QTcpServer 人のソケットまでは接続を受け付け、排出の newConnection() 信号です。


その QTcpServer ないそのもの呼び出しイベント-ループ/ソケット-モニタリングシステムでできるか否かに依存する QSocketNotifier で非同期仔のに接続します。

時の同期方法 waitForNewConnection() はそれだけですべてのfpga QSocketNotifier スタッフの話 accept() るブロックのスレッドであったり、あるいは、着信接続します。

他のヒント

QTのほとんどの「シーンの背後にある」機能は、QCoreApplicationのメインイベントループ内で発生します。シグナル/スロット、タイマーなど
例はJavaScriptです - イベントをバインドしますが、イベントループはブラウザによって処理されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top