質問
明かしたいと思っています。QTcpServer作品の裏に関するスレッドとブロック. QTcpServer
は listen()
法ヤをただちに復帰します。場合は聴を開始し、サーバは光信号を 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()
ている。
解決
って掘削を通じて、ソースコードの QtCore
や QtNetwork
モジュールです。
Aperantly, QTcpServer
することのできるモード: 同期 や 非同期.
に 同期 モードを呼び出した後 listen()
呼び出し側で通話 waitForNewConnection()
るブロッキング方法(スレッドが眠るまで人に接続し、リスニング。このように QTcpServer
新しいスレッドなイベントループを実行します。
に 非同期 モード QTcpServer
レーザの newConnection()
信号が接続されました。ができることが必要になりのイベントループruning.裏付、 QCoreApplication
の QEventLoop
や QAbstractEventDispatcher
(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です - イベントをバインドしますが、イベントループはブラウザによって処理されます。