我正在开发一个聊天程序,其中客户端是单线程的,但服务器将为每个连接的客户端启动一个新线程。我相信我的客户端代码是可靠的,但服务器让我感到困惑。
现在,我有一个派生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
答案 0 :(得分:1)
是的,你是以错误的方式解决这个问题。由于平台限制,GUI是单线程系统。您无法在不同的线程上创建,更改和管理GUI对象 - 所有操作都必须在一个线程(通常是GUI线程)上完成。
Qt有两种处理工作线程和GUI的机制:排队信号和插槽,以及QCoreApplication :: postEvent()处理程序。
更多详细信息在综合Qt线程文档中:http://doc.qt.io/qt-5/thread-basics.html