0

我正在尝试将连接处理程序(包含 QTCPSocket 对象)从 QMainWindow 对象移动到单独的线程。

到目前为止它可以工作,但是如果我关闭 QMainWindow,它会崩溃并且我会收到以下信息:

QCoreApplication::sendEvent 中的 ASSERT 失败:“无法向其他线程拥有的对象发送事件。当前线程 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's going to crash a bit later if I have this line
}

m_TCPSocket 应该在正确的线程中被删除,但我感觉通过关闭主线程,亲缘关系变得混乱。

我应该怎么办?

4

1 回答 1

0

我认为可能会发生两件事:

  1. 据我记得,Qt4 在moveToThread()调用QAbstractSocket.
  2. 当你调用deleteLater()你的套接字时,它所在的线程已经停止了。

一个可能的解决方案可能是将您的CommsHandlerIPfrom子类化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;
}
于 2013-10-11T12:07:50.887 回答