• 4802阅读
  • 23回复

[提问]对于5M内的数据使用什么办法读写比较好? [复制链接]

上一主题 下一主题
离线蚂蚁power
 

只看楼主 倒序阅读 楼主  发表于: 2015-11-16
服务器向客户端发送数据,最大不超过5M,客户端循环读取直到读完为止,然后将读取到的数据显示到表格中。试过QTextStream保存到文本文件然后在读取文本数据显示到表格中。速度大约4秒。换了一种方式,QString *content = new QString,  new一个content然后将数据append到里面,然后在读取数据。竟然发现速度不但没提高反而更慢了,变成了7-8秒。
请问是我使用的方式不对吗?或者有没有其他的好的办法呢?
离线roywillow

只看该作者 1楼 发表于: 2015-11-16
接收到的不一般是QByteArray吗?直接把这个提供给QTextStream作为device读取难道不可以?
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线圣域天子

只看该作者 2楼 发表于: 2015-11-16
5M读取要4秒,这个时间不正常的。

远程的吗?不在局域网内?
离线XChinux

只看该作者 3楼 发表于: 2015-11-16
如果是网络传输,你的常用数据,都可采用QVariant保存的吧?那你可以使用QDataStream,将其保存成二进制的,用char*或std::string来传输,下面是我写的两个模板函数:


    template <typename T>  T bin2var(const std::string &str)
    {
        QByteArray ba = QByteArray::fromStdString(str);
        QDataStream in(&ba, QIODevice::ReadOnly);
        T data;
        in >> data;
        return data;
    }

    template <typename T>  std::string var2bin(const T &var)
    {
        QByteArray ba;
        QDataStream out(&ba, QIODevice::WriteOnly);
        out << var;
        return ba.toStdString();
    }

至于你的几秒读完数据,这个你自己搞定吧。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线yanwuyue

只看该作者 4楼 发表于: 2015-11-16
接收数据是不是在主线程里了,刷GUI是很慢的
离线z609932088

只看该作者 5楼 发表于: 2015-11-16
睡觉
有阳光的地方就是青春
离线蚂蚁power

只看该作者 6楼 发表于: 2015-11-17
回 roywillow 的帖子
roywillow:接收到的不一般是QByteArray吗?直接把这个提供给QTextStream作为device读取难道不可以? (2015-11-16 19:59) 

我也改成这个了,以前用的是char*。速度慢是服务器的问题。。。。
离线蚂蚁power

只看该作者 7楼 发表于: 2015-11-17
回 圣域天子 的帖子
圣域天子:5M读取要4秒,这个时间不正常的。
远程的吗?不在局域网内?
 (2015-11-16 20:23) 

经过联调测试,发现是服务器发送的慢
离线蚂蚁power

只看该作者 8楼 发表于: 2015-11-17
回 XChinux 的帖子
XChinux:如果是网络传输,你的常用数据,都可采用QVariant保存的吧?那你可以使用QDataStream,将其保存成二进制的,用char*或std::string来传输,下面是我写的两个模板函数:
    template <typename T>  T bin2var(const std::string &str)
& .. (2015-11-16 21:57) 

先谢谢总教头!发现是服务器发送的慢,经过修改已经达到400毫秒了。但是我的处理速度上model->setData()要用2.8-3秒的时间。setData貌似本身就慢吧。
离线蚂蚁power

只看该作者 9楼 发表于: 2015-11-17
回 yanwuyue 的帖子
yanwuyue:接收数据是不是在主线程里了,刷GUI是很慢的 (2015-11-16 22:07) 

发送和接受都是在主线程,次线程只是控制循环调用主线程的发送方法,和将接收到的数据显示到表格中。
离线蚂蚁power

只看该作者 10楼 发表于: 2015-11-17
回 z609932088 的帖子
z609932088:[表情] 睡觉 (2015-11-16 22:20) 

离线圣域天子

只看该作者 11楼 发表于: 2015-11-17
没用子线程啊?几十个用户保管死翘翘, 呵呵
离线蚂蚁power

只看该作者 12楼 发表于: 2015-11-17
回 圣域天子 的帖子
圣域天子:没用子线程啊?几十个用户保管死翘翘, 呵呵 (2015-11-17 10:45) 

子线程用来负责控制循环请求数据并且放到表格中,不会有那么多连接的,一个服务器不超过5个连接
离线XChinux

只看该作者 13楼 发表于: 2015-11-17
回 蚂蚁power 的帖子
蚂蚁power:先谢谢总教头!发现是服务器发送的慢,经过修改已经达到400毫秒了。但是我的处理速度上model->setData()要用2.8-3秒的时间。setData貌似本身就慢吧。 (2015-11-17 10:32) 

setData()....你用的model是哪个?
如果你要高效,就得自己写model而不能直接用现成的model了。
一方面是为了model数据存储高效,另一方面是要正确的时间通知view更新界面。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线yanwuyue

只看该作者 14楼 发表于: 2015-11-17
回 蚂蚁power 的帖子
蚂蚁power:发送和接受都是在主线程,次线程只是控制循环调用主线程的发送方法,和将接收到的数据显示到表格中。 (2015-11-17 10:34) 

我有点看不懂你讲什么,前面说接收在主线程里,最后一句又说次线程接收数据并刷表格(就是gui),
到底接受函数是在主线程里,还是次线程里,
如果是在主线程里(我觉得楼主的现象应该就是写在主线程里了),
net口接收到数据,刷gui,net卡住(也就是暂停了数据传输),刷完gui,net又激活,以此循环,
服务端看上去就是发送数据很慢
离线蚂蚁power

只看该作者 15楼 发表于: 2015-11-18
回 XChinux 的帖子
XChinux:setData()....你用的model是哪个?
如果你要高效,就得自己写model而不能直接用现成的model了。
一方面是为了model数据存储高效,另一方面是要正确的时间通知view更新界面。 (2015-11-17 20:39) 

继承的QStandardItemModel。setData就是用的父类的。第一次显示数据时先New QStandardItemModel。然后setData,这样就很慢,用时2.8-3秒,等第二次以后每次setData就几百毫秒。由于第一次太慢我就改成QStandardItem了,然后model->appendRows()现在速度是1.9秒。(所有的测试都是加载5000条数据)
离线蚂蚁power

只看该作者 16楼 发表于: 2015-11-18
回 yanwuyue 的帖子
yanwuyue:我有点看不懂你讲什么,前面说接收在主线程里,最后一句又说次线程接收数据并刷表格(就是gui),
到底接受函数是在主线程里,还是次线程里,
如果是在主线程里(我觉得楼主的现象应该就是写在主线程里了),
net口接收到数据,刷gui,net卡住(也就是暂停了数据传输),刷完gui,net又激活,以此 .. (2015-11-17 21:39) 

子线程调用主线程的方法发送请求数据命令,然后调用主线程的接收数据的方法并且将接受到的数据保存到文本文件中,然后子线程在读取文本文件并显示到表格中。
离线XChinux

只看该作者 17楼 发表于: 2015-11-18
QStandardItemModel效率很低的,你每次更新item属性,它都会通知view刷新界面,所以才需要你自己写model,一方面是简化数据存储,另一方面是可以控制刷新时间,比如你新增100条数据,
那这100条数据全放到model里后,再通知view刷新对应的区域。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线蚂蚁power

只看该作者 18楼 发表于: 2015-11-19
回 XChinux 的帖子
XChinux:QStandardItemModel效率很低的,你每次更新item属性,它都会通知view刷新界面,所以才需要你自己写model,一方面是简化数据存储,另一方面是可以控制刷新时间,比如你新增100条数据,
那这100条数据全放到model里后,再通知view刷新对应的区域。 (2015-11-18 11:35) 

OK 我重写一个model吧,继承QAbstractItemModel,应该可以吧
离线z55716368

只看该作者 19楼 发表于: 2015-11-28
回 蚂蚁power 的帖子
蚂蚁power:OK 我重写一个model吧,继承QAbstractItemModel,应该可以吧 (2015-11-19 09:59) 

楼主可以吧你重写的model发出来看看吗 这个还真不是太懂
每一个问题 都是一次进步
离线XChinux

只看该作者 20楼 发表于: 2015-11-28
看《Qt高级编程》中3、4、5、6章节,专门讲model/view编程的。
4条评分好评度+1贡献值+1金钱+10威望+1
蚂蚁power 好评度 +1 优秀文章,支持!n神马都是浮云 2015-11-30
蚂蚁power 贡献值 +1 优秀文章,支持!n神马都是浮云 2015-11-30
蚂蚁power 威望 +1 优秀文章,支持!n神马都是浮云 2015-11-30
蚂蚁power 金钱 +10 优秀文章,支持!n神马都是浮云 2015-11-30
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线蚂蚁power

只看该作者 21楼 发表于: 2015-11-30
回 z55716368 的帖子
z55716368:楼主可以吧你重写的model发出来看看吗 这个还真不是太懂 (2015-11-28 16:37) 

你看看Qt高级编程吧。我也是看着那个写的。
离线z55716368

只看该作者 22楼 发表于: 2015-11-30
回 XChinux 的帖子
XChinux:看《Qt高级编程》中3、4、5、6章节,专门讲model/view编程的。 (2015-11-28 20:28) 

哦哦哦
每一个问题 都是一次进步
离线z55716368

只看该作者 23楼 发表于: 2015-11-30
回 蚂蚁power 的帖子
蚂蚁power:你看看Qt高级编程吧。我也是看着那个写的。 (2015-11-30 09:26) 

好吧、、、、、、、、、、、、、、
每一个问题 都是一次进步
快速回复
限100 字节
 
上一个 下一个