基于Qt的收银点餐系统之解决因网络请求延迟而带来的问题
2017-10-24 19:34
267 查看
网络请求在另一个线程中,故主线程中会在进行网络请求的同时继续进行网络请求之后的操作。如果这之后的操作需要用到网络请求的数据,则可能会出现错误。解决方案如下:
1)使主线程暂停
参考:关于在Qt里让程序休眠一段时间的方法总结
这样做的原因:QNetworkAccessManager的网络请求API设计本身是异步的,由于我还没太弄懂,我给它直接看成另外开了一个线程,然后把主线程暂停了。需要学习一下slot/signal机制的同步和异步。
2) 利用本地数据库
可以将要用到的数据存在本地数据库中,仅在需要的时候进行网络请求获取数据,其余时候均直接在本地数据库中进行取数。
参考:
数据库简介
安装MySQL数据库
利用QSqlQuery类执行SQL语句
1)使主线程暂停
参考:关于在Qt里让程序休眠一段时间的方法总结
QEventLoop loop; QObject::connect(&manager2,SIGNAL(finished(QNetworkReply*)),&loop,SLOT(quit())); QObject::connect(&manager2,SIGNAL(finished(QNetworkReply*)),this,SLOT(getShopCatalogGoodsList(QNetworkReply*))); loop.exec();
这样做的原因:QNetworkAccessManager的网络请求API设计本身是异步的,由于我还没太弄懂,我给它直接看成另外开了一个线程,然后把主线程暂停了。需要学习一下slot/signal机制的同步和异步。
2) 利用本地数据库
可以将要用到的数据存在本地数据库中,仅在需要的时候进行网络请求获取数据,其余时候均直接在本地数据库中进行取数。
参考:
数据库简介
安装MySQL数据库
利用QSqlQuery类执行SQL语句
void goodsList::dataPrepare(){ //店铺中商品分类和对应分类下的商品 /*判断是否存在catalog 和 shop_catagory_goods_list *不存在:建表(动态的建表,goodslist_1.db 原来并不存在),从网络端取数据 用到那些request * 存在(更新之后)或者建表之后:得到classifyList和catalogGoodsBeanList[] */ db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName("goodsList_1.db"); if(!db.open()) qDebug() << "database failed to open."; QSqlQuery query(db); int isExistSC = db.tables().contains(QString("shop_classify")); int isExistSCGL = db.tables().contains(QString("shop_goods")); qDebug() << "table exist?" << isExistSC << " " << isExistSCGL; //店铺中商品分类 if(isExistSC == 0){ requestForGetClassify(); //初始化classifyList 在getClassify中还有建表操作 } else{ query.exec("select * from shop_classify"); //获取查询集的大小 // qDebug() << "size = " << query.at() + 1; //qt中不支持用query.size()来获取查询集的大小 while(query.next()){ int _id = query.value(0).toInt(); QString _nm = query.value(1).toString(); GoodsClassifyBean *bean = new GoodsClassifyBean(_id,_nm); qDebug() << "_id _nm in fangwen local DB" << _id <<_nm; classifyList.append(bean); } } //不管是上面的哪一种情况,到这之后classifyList应该已经准备好了 //对应分类下的商品 if(isExistSCGL == 0) { //得到所有的catalogGoodsBeanList,同一建表 for(int i = 0 ; i < classifyList.size();i++){ GoodsClassifyBean* GCItem = classifyList.at(i); int catalog3 = GCItem->getId(); //请求分类时的catalog3是分类的id tool_catalogGoodsBeanList.clear(); requestForGetShopCatalogGoodsList(sid,catalog3,0,10); qDebug() << "打印 tool_catalogGoodsBeanList.size() = " << tool_catalogGoodsBeanList.size(); catalogGoodsBeanList[i] = tool_catalogGoodsBeanList; } **createNewTable("shop_goods");** } else{ for(int i = 0 ; i < classifyList.size();i++){ int catalog3 = classifyList.at(i)->getId(); catalogGoodsBeanList[i].clear(); // query.exec("select * from shop_goods where catalog3 = " + catalog3); //这样使用变量是不可以的,查不到结果 query.exec(QString("select * from shop_goods where catalog3 = %1").arg(catalog3)); while(query.next()){ int _id = query.value(0).toInt(); QString _name = query.value(1).toString(); QString _unit = query.value(2).toString(); double _price = query.value(3).toDouble(); int _status = query.value(4).toInt(); int _catalog3 = query.value(5).toInt(); qDebug() << "results in local DB" << _id << _name << _unit << _price; GoodsBean *item = new GoodsBean(_id,_name,_unit,_price,_status,_catalog3); catalogGoodsBeanList[i].append(item); } } } int isExistSC_haha = db.tables().contains(QString("shop_classify")); int isExistSCGL_haha = db.tables().contains(QString("shop_goods")); qDebug() << "table exist_2?" << isExistSC_haha << " " << isExistSCGL_haha; }
void goodsList::createNewTable(QString tableName){ if(tableName == "shop_classify"){ QSqlQuery query(db); query.exec("create table shop_classify(id int primary key , name varchar)"); for(int i = 0; i < classifyList.size();i++){ query.prepare("insert into shop_classify(id,name) values(:id,:name)"); GoodsClassifyBean *item = classifyList.at(i); int _id = item->getId(); QString _nm = item->getName(); /* *之前写成了 query.bindValue(_id, _nm) 所以总是报错 qvector.h : out of memory * 在直接查out of memory 无果之后, 自查锁定可能是bindValue用错了 * 果然用错了,参数意义搞错了。 所以下次遇到新的函数,先看看它的定义 */ query.bindValue(0,_id); query.bindValue(1,_nm); query.exec(); } query.exec("select * from shop_classify"); while(query.next()){ qDebug() << "value0 value1" << query.value(0).toInt()<< " " << query.value(1).toString(); // } } }
相关文章推荐
- 解决Win2000Sever登录时“不支持网络请求,系统无法让您登陆”问题
- 教你几招 解决Windows 7网络延迟问题
- VM虚拟机Solaris系统与主机WinXP系统网络不通问题解决
- 解决RHEL6.5系统设置IP后,重启网络服务显示设备不存在问题
- 远程操作linux网络设置(五)-ssh登录慢有延迟问题的解决
- ubuntu解决“系统的网络服务与此版本的网络管理器不兼容“问题
- ACM做音频传输的时候,有严重的延迟问题,这个控件来自网络,添加了4个录音缓冲区,解决延迟问题
- 网络电台研究(3)Fragment系统学习,解决各种问题
- 解决联想RQ940安装REDHAT5.8系统网络PING不通的问题
- Broadcom网卡linux系统下无法连接到网络问题(某种情况- -||)的解决办法
- SQLServer 2012中设置AlwaysOn解决网络抖动导致的提交延迟问题
- 解决Ubuntu 12.04更新后 ”系统的网络服务与此版本的网络管理器不兼容“问题
- 安卓开发时酷派手机不打印请求网络信息问题的解决
- 【Win7网络延迟问题多种解决方法】
- 解决Angularjs中循环网络请求回调中值的调用问题
- 安装校园网络登录系统后出现问题解决办法
- 手把手教你解决android网络请求问题:android.os.NetworkOnMainThreadException
- 网络布线跨度过长导致信号延迟问题的解决方法
- x3650 M4 usb cobbler PXE install linux system 使用网络装系统问题,及解决方法