2017-04-11 13 views
0

特定のリクエストが来たときにqthreadsを生成するQtで書かれた大きなプロジェクトを修正しています。これらのスレッドはそれぞれ、メインスレッドで作成され、サーバーに接続されたQTcpSocketを書き込みます。複数のスレッドからQTcpSocketにアクセスする

スレッドクラスにはQTcpSocketへの参照があります。必要に応じてソケットにデータを書き込み、waitForBytesWrittenを呼び出してから戻ります。

スレッドはreadyRead信号がソケットから放出されるまで条件を待ちます。

ソケットのアクセスはmutexで保護されています。

私の問題は、「QSocketNotifier:ソケット通知機能を他のスレッドから有効または無効にすることはできません」という警告が表示されることです。これは私が別のスレッドからソケットに書いているからです(ソケットはメインスレッドで作成されています)。

信号とスロットを使用して書き込みと読み取りを行うのが最適な解決策であることはわかっていますが、残念ながらプロジェクトは非常に複雑で、この動作を変更する時間はありません。

どうすればよいですか?

+0

'QTcpSocket'インスタンスの直接使用を取り除き、シグナル/スロットを使用するのは難しくありません。コンパイラは、生成されたコンパイルエラーで変更が必要なすべての場所を表示します。 –

+0

あなたはミューテックスをロックする複数のスレッドを持っています。ソケットに書き込み、応答を待ってからミューテックスをロック解除します。もしそうなら、あたかもコードで使用されているスレッドモデルが根本的に間違っているかのように、実際にはうまくいっています。このコードは既に動作していて、修正する必要がありますか、それとも本質的にすべての新しいコードですか。 –

答えて

1

QTcpSocketインスタンスのthread affinityを変更して、警告を抑制することができます。

これは本当に正しい方法ではなく、信号/スロットを使用する方がよいでしょう。

+0

QTcpSocketは同時に複数のスレッドからアクセスできるため、意味がないようです... –

+0

またはロックされたmutexで動作する場合のみ –

+0

シグナルスロットを使用して終了しました...それは唯一の良い解決策でした。ありがとうございました。 – mrAlmond