您的位置:首页 > 理论基础 > 计算机网络

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  TCP