基于Qt的收银点餐系统之解决因网络请求延迟而带来的问题

网络请求在另一个线程中,故主线程中会在进行网络请求的同时继续进行网络请求之后的操作。如果这之后的操作需要用到网络请求的数据,则可能会出现错误。解决方案如下:
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();
//        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_35153254/article/details/78333467