• QT 信号已发出,但是槽函数未执行


    问题描述

      我的工程使用UDP进行通信,初始程序运行正常。运行一段时间后,udp正常接收数据,并且成功将收到的数据发出信号,但是此时不执行槽函数。 并且界面出现卡死现象。

    猜想可能:

      线程阻塞、对象异常销毁(总感觉没有遇到过,后边发觉确实想多了)

    后续解决:

      1.使用数据库连接池的时候只是增加db,每次使用完毕未将db置为空闲状态,导致各个模块获取db并且db数据量大于等于最大连接数的时候,获取db的时候产生死循环等待。

      2.多个模块共用一个线程,某几个模块耗时过长,导致接收数据槽函数的对象所在线程死锁。

      3.某个模块使用数据库查询数据的时候使用while循环,每次循环将获取的数据不断发送前端,而我忘记对query进行break,导致后台不断向界面发送数据,界面卡死。(界面卡死的原因)

    伪代码:

      { //改用数据库使用

        db = getDb(); //获取db

        use... db; //使用db

        removeDb(&db);//移除db或者将db置为空闲状态。

      }

      { //耗时线程单独开线程

        Model modeRcv; //数据接收槽函数所在线程

        Model_ modeOther; 

        //数据接收槽函数所在模块单独开辟一个线程

        modeRcv.moveToThread(&thread1);

        modeOther.moveToThread(&thread2);

      }

    补充:

      后续遇到问题:当数据库异常的时候,整个后台处理变慢、甚至卡死。

      原因:1.数据库读写和业务处理公用线程,当数据库异常的时候,db.open()函数的返回时间大于10s(可以通过函数设置,但是最少不低于2s),这些频繁open耗时过长导致程序卡顿。 2.获取db的操作使用了工具类实现,工具类中含有线程锁。当数据库异常的时候调用数据库连接清理函数的时候,导致死锁。即获取db的函数和清理连接函数公用一个锁,重复加锁导致死锁。

      解决办法:1.将所有数据库操作单独放置一个线程:

            优点:程序开启的线程少,消耗cpu较少。

            缺点:操作数据库的模块划分耦合度会比较高。

           2.在各个模块把数据库操作放入一个和业务不同的线程操作:

            优点:各个模块耦合度比较低。

            缺点:程序开启的线程多,消耗cpu较多。

             3.去掉清理数据库连接函数中的加锁操作。

      

    坚持成就伟大
  • 相关阅读:
    hadoop中namenode发生故障的处理方法
    开启虚拟机所报的错误:VMware Workstation cannot connect to the virtual machine. Make sure you have rights to run the program, access all directories the program uses, and access all directories for temporary fil
    Hbase的安装与部署(集群版)
    分别用反射、编程接口的方式创建DataFrame
    用Mapreduce求共同好友
    SparkSteaming中直连与receiver两种方式的区别
    privot函数使用
    Ajax无刷新显示
    使用ScriptManager服务器控件前后台数据交互
    数据库知识
  • 原文地址:https://www.cnblogs.com/xian-yongchao/p/14920535.html
Copyright © 2020-2023  润新知