Я пытаюсь переместить обработчик соединения (содержащий объект QTCPSocket) в отдельный поток из объекта QMainWindow.
Пока это работает, но если я закрою QMainWindow, он сработает, и я получаю следующее:
Ошибка ASSERT в QCoreApplication :: sendEvent: "Не удается отправить события объектам, принадлежащим другому потоку. Текущий поток 1680d0. Получатель" (типа "QAbstractSocket") был создан в потоке 34fe0c "
Вот мой код: в конструкторе QMainWindow (подклассом):
QThread m_commsThread;
m_pICommsHandler = new CommsHandlerIP();
m_pICommsHandler->moveToThread(&m_commsThread);
// when it starts, we start the connection
connect(&m_commsThread,SIGNAL(started()),m_pICommsHandler,SLOT(connectToHost()));
m_commsThread.start();
в деструкторе QMainWindow:
m_commsThread.quit();
m_commsThread.wait();
delete m_pICommsHandler;
О CommsHandlerIP.cpp
CommsHandlerIP::CommsHandlerIP() {
m_TCPSocket = new QTcpSocket(this);
}
CommsHandlerIP::~CommsHandlerIP(void)
{
m_TCPSocket->deleteLater(); // It going to crash a bit later if I have this line
}
m_TCPSocket должен быть в правом потоке, который нужно удалить, но я чувствую, что, закрыв основной поток, сродство стало беспорядочным.
Что мне делать?
Я думаю, что может произойти две вещи:
moveToThread()
в QAbstractSocket
.deleteLater()
в своем сокете, поток, в котором он живет, уже остановлен. Возможным решением может быть подкласс CommsHandlerIP
из QThread
и переопределить run()
:
CommsHandlerIP::CommsHandlerIP() :
QThread(),
m_TCPSocket(0)
{
moveToThread(this);
}
void CommsHandlerIP::run()
{
m_TCPSocket = new QTcpSocket(this);
connectToHost();
exec();
m_TCPSocket->close();
delete m_TCPSocket;
}