0

C++/Qt 5.12.1 で記述されたコンソール マルチスレッド アプリケーションをデバッグします。Linux Mint 18.3 x64 で動作しています。

このアプリにはSIGINTハンドラーQWebSocketServerQWebSocketテーブルがあります。テーブル内の項目に対して/を使用close() QWebSocketServerして呼び出し、終了を処理します。abort()deleteLater()QWebSocket

Websocket クライアントがこのコンソール アプリに接続すると、実行中のスレッドが原因で終了に失敗します (内部QWebSocketスレッドだと思います)。接続がなければ、終了は成功です。

修正方法は?アプリが正常に終了するようにします。

4

2 に答える 2

1

ソケットサーバーを正常に終了するには、次のように試みます。

最も重要な部分は、スロットがQCoreApplication::quit() を呼び出すように、メイン スレッド イベント ループを実行してQWebSocketServer::closed()で待機できるようにすることです。

これは、次の方法でも実行できます。

connect(webSocketServer, &QWebSocketServer::closed,
        QCoreApplication::instance(), &QCoreApplication::quit);

詳しい対応は必要ありません。

pauseAccepting()すべての前にその信号を接続した後、それ以上の接続を防ぐために続行します. コールしQWebSocketServer::closeます。

上記で十分な場合、以下は必要ないかもしれません。最初に上記を試して、まだ問題がある場合にのみ、既存および保留中の接続に対処する必要があります。私の経験から、動作はプラットフォームによって異なり、サーバー環境でのいくつかの独自の websocket 実装によって異なります (これはおそらく Qt にすぎません)。

インスタンスを含む配列がある限り、それらすべてQWebSocketを呼び出しQWebSocket::abort()てすぐに解放することができます。このステップは、質問の作成者によって説明されているようです。

QWebSocketServer::nextPendingConnection()を使用して保留中の接続を反復し、それらを呼び出してみてください。それも機能する場合は、 を呼び出します。abort()deleteLater

于 2019-07-26T15:13:02.677 に答える