0

マルチスレッドサーバーがあります(QTcpServerを継承します)。新しい接続が表示されたら、新しいタスクを作成し(QRunnableを継承)、ソケット記述子をコンストラクターに渡し、このタスクをQThreadpool(3つのワーカーを持つ)にプッシュします。

QThreadPool::globalInstance()->start(task);

run()で、QTcpSocketを動的に作成し、ソケット記述子を設定して、最初に受信したバイトを読み取ります。このバイトの値に基づいて、新しい特定のタスクを作成し(QRunnableも継承します)、以前に作成したQTcpSocketオブジェクトへのctrポインターを渡し、このタスクをQThreadpoolにプッシュします。

この特定のタスクにより、ルーチンとアプリがクラッシュします。ログファイルから、この特定のタスクのデストラクタが呼び出されたことがわかります。

また、QtCreatorは次のエラーメッセージをスローします。

QObject:別のスレッドにある親の子を作成できません。(親はQNativeSocketEngine(0x18c62290)、親のスレッドはQThread(0x18c603e0)、現在のスレッドはQThread(0x18cc3b60)QSocketNotifier:ソケット通知機能を別のスレッドから無効にすることはできませんQCoreApplication :: sendEvent:"が所有するオブジェクトにイベントを送信できません別のスレッド。現在のスレッド18cc3b60。レシーバー''(タイプ'QNativeSocketEngine')はスレッド18c603e0 "、ファイルkernel / qcoreapplication.cpp、行420で作成されました。

同様の投稿を見つけましたが、残念ながら問題の解決方法がわかりませんでした。私を助けてください。

4

1 に答える 1

1

はスレッドセーフではないQTcpSocketため、2つの異なるスレッドから使​​用することはできません。QObject

最初のタスクでを作成QTcpSocketしたので、そのタスクに関連付けられたスレッドに「存続」します。そのポインタを別のに渡すQRunnableと、2番目のスレッドがそれにアクセスしようとします。これにより問題が発生します。

QTcpSocket異なるスレッド間で同じものを共有しない方法でアプリを再設計する必要があります。1つの可能性は、元のタスクにさまざまな特定の関数を実装し、最初に受信したバイトに基づいて適切な関数を選択することです。

于 2013-02-17T07:25:53.397 に答える