QTcpSocket readAll 后程序崩溃
2017-10-08 11:48
295 查看
目前发现的问题就出现在上面的写入文件中的reply->readAll()函数,只要使用了这个函数,程序就崩溃(下载小文件没事,下载大文件时间久了就崩溃),报的错误有三种:
1 无效的指针(我记录了这个指针,每次都是不一样的)
2 double free
3 直接异常结束,没有错误提醒
现在问题就是,reply的read、readAll、readData,ReadLine等读取数据的函数都使用过了,都会崩溃,如果不使用这几个函数的话程序是没有问题的(当然啦,读不了数据)
此问题已经解决
原因是reply跟manager这两个对象是在run函数中new出来的,按照Qt官方的说法,继承于QThread的类只是线程的管理者而不是子线程本身,所以reply对象属于子线程,而reply->readAll函数则是在主线程中执行的(可以使用currentThreadId打印出run函数所处的线程ID还有reply->readAll函数所处的线程,不管在哪个子线程对象中,reply->readAll函数打印的ID都会与主线程相同),问题正在于此,根据http://www.qtcentre.org/threads/27112-I-think-there-is-a-problem-with-QNetworkReply-and-threads这篇帖子中六楼的Rembobo所说,子线程中的某些指针(reply)在子线程中已经成为无效指针的时候,在主线程中可能还被当作有效的指针,
当去使用一个无效指针的时候,结果可想而知。
Solution:
When move Logical module using MoveToThread() to the thread, First QTcpSocket.readAll() in the mainThread, then in the mainThread emit signal with parameter(recvived data) to the Logical module(Because now the Logical module is working on the subThread).
Instead of directly in the Logical module using QTcpSocket.readAll() !
QTcpSocket //in the mainThread
Logical module //in the subThread
thread //independent
1 无效的指针(我记录了这个指针,每次都是不一样的)
2 double free
3 直接异常结束,没有错误提醒
现在问题就是,reply的read、readAll、readData,ReadLine等读取数据的函数都使用过了,都会崩溃,如果不使用这几个函数的话程序是没有问题的(当然啦,读不了数据)
此问题已经解决
原因是reply跟manager这两个对象是在run函数中new出来的,按照Qt官方的说法,继承于QThread的类只是线程的管理者而不是子线程本身,所以reply对象属于子线程,而reply->readAll函数则是在主线程中执行的(可以使用currentThreadId打印出run函数所处的线程ID还有reply->readAll函数所处的线程,不管在哪个子线程对象中,reply->readAll函数打印的ID都会与主线程相同),问题正在于此,根据http://www.qtcentre.org/threads/27112-I-think-there-is-a-problem-with-QNetworkReply-and-threads这篇帖子中六楼的Rembobo所说,子线程中的某些指针(reply)在子线程中已经成为无效指针的时候,在主线程中可能还被当作有效的指针,
当去使用一个无效指针的时候,结果可想而知。
Solution:
When move Logical module using MoveToThread() to the thread, First QTcpSocket.readAll() in the mainThread, then in the mainThread emit signal with parameter(recvived data) to the Logical module(Because now the Logical module is working on the subThread).
Instead of directly in the Logical module using QTcpSocket.readAll() !
QTcpSocket //in the mainThread
Logical module //in the subThread
thread //independent
相关文章推荐
- (Qtcpsocket)退出程序时提示段错误的解决
- QTcpServer、QTcpSocket、QUdpSocket在聊天程序上的应用
- Qt: 基于QTcpSocket的聊天程序
- QT tcpsocket 在断开后重新连接程序直接崩溃
- QT tcpsocket 在断开后重新连接程序直接崩溃
- QT类似于QQ的即时聊天程序用开发QTcpServer,QTcpSocket简单开发
- QT类似 4000 于QQ的即时聊天程序用开发QTcpServer,QTcpSocket简单开发
- QT 使用QTcpServer QTcpSocket 建立TCP服务器端 和 客户端
- 如何用QTcpSocket传送图片
- Qt之QTcpServer/QTcpSocket简单收发信息(2)
- 基于QTcpSocket和QTcpServer的Tcp通讯以及QDataStream序列化数据
- qt程序崩溃生成core dump
- QTcpsocket
- QT的QHttp无信号发出,窗口程序关闭时崩溃
- QTcpSocket类 客户端/服务器模式
- QTcpSocket服务器 定时器,多线程结合
- QTcpSocket 在子线程执行测试笔记
- qtcpsocket调用write和read函数写数据乱码问题解决方法
- QTcpSocket使用过程中的一些问题记录
- Android socket 学习记录 之 执行new socket(ip, port)程序崩溃