Я работаю над программой чата, в которой клиент является однопоточным, но сервер запускает новый поток для каждого подключенного клиента. Я считаю, что мой клиентский код надежен, но сервер сбил меня с толку.
Прямо сейчас у меня есть производный класс 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
?
- Я поступаю совершенно неправильно?
- Любые другие общие идеи о том, почему это не работает, как я ожидаю
или как это исправить было бы очень полезно.