Qt threading, Crash из деструктора QObject перемещен

0

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

Что мне делать?

Теги:
multithreading
qthread
qt4

1 ответ

0

Я думаю, что может произойти две вещи:

  1. Насколько я помню, всегда возникали проблемы с Qt4 при вызове moveToThread() в QAbstractSocket.
  2. Когда вы вызываете 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;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню