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 对象 - 一切都必须在一个线程(通常是 GUI 线程)上完成。

Qt 有两种处理工作线程和 GUI 的机制:排队的信号和插槽,以及 QCoreApplication::postEvent() 处理程序。

更多详细信息在综合 Qt 线程文档中: http: //doc.qt.io/qt-5/thread-basics.html

于 2011-11-25T19:41:56.247 回答