0

クライアントがシングルスレッドであるチャットプログラムに取り組んでいますが、サーバーは接続されたクライアントごとに新しいスレッドを開始します。私のクライアントコードはしっかりしていると思いますが、サーバーは私を当惑させています。

現在、QTcpSocket着信接続を検索する派生クラスがあり、接続が検出されると、新しいを開始しQThreadます。実行すると、 (チャットウィンドウである)QThreadのインスタンスが作成され、表示されます。QMainWindow

void secureserver::incomingConnection(int socketDescriptor)
{
    securethread *thread = new securethread(socketDescriptor, this);
    connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
    thread->start();
}

void securethread::run()
{
    serverwindow myServerWindow;
    myServerWindow.setSocketDescriptor(mySocket);
    myServerWindow.show();
}

次のようなstderrorのエラーが発生していますが、QMainWindow表示されないため、現時点ではチャットできません。

QObject: Cannot create children for a parent that is in a different thread.
(Parent is QApplication(0xbf9e5358), parent's thread is QThread(0x98a54f0), current thread is securethread(0x99e9250)
QPixmap: It is not safe to use pixmaps outside the GUI thread

私の質問は次のとおりです。

  • QThreadの親にする必要がありQMainWindowますか?
  • 私はこれを完全に間違った方法で行っていますか?
  • これが期待どおりに機能しない理由や修正方法に関するその他の一般的なアイデアも大歓迎です。
4

1 に答える 1

1

はい、あなたはこれについて間違った方法で行っています。プラットフォームの制限により、GUIはシングルスレッドシステムです。異なるスレッドでGUIオブジェクトを作成、変更、および管理することはできません。すべてを1つのスレッド(通常はGUIスレッド)で実行する必要があります。

Qtには、ワーカースレッドとGUIを処理するための2つのメカニズムがあります。キューに入れられたシグナルとスロット、およびQCoreApplication :: postEvent()ハンドラーです。

詳細については、包括的なQtスレッドドキュメントを参照してください:http://doc.qt.io/qt-5/thread-basics.html

于 2011-11-25T19:41:56.247 に答える