我正在尝试将连接处理程序(包含 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 应该在正确的线程中被删除,但我感觉通过关闭主线程,亲缘关系变得混乱。
我应该怎么办?