qt主窗口子窗口的问题

版权声明:本文为博主原创文章,未经博主允许不得转载O(∩_∩)O https://blog.csdn.net/qq_38153833/article/details/86659322

报错:
ensorflow.python.framework.errors_impl.InternalError,from device: CUDA_ERROR_OUT_OF_MEMORY
突然一个报错让我触不及防,原来是内存空间不足,莫名其妙也不查是哪个程序占用了,重启电脑更快解决。

然而过几天才发现,其实是自己qt里面代码写得有问题,虽然主窗口点击一个按钮,hide主窗口show子窗口,子窗口返回来也是hide子窗口show主窗口,但是这样其实是新建一个窗口,看起来是没什么变化,但是这里的窗口不是原来的是新建的是占用内存的。之前的那个窗口还在内存中,这样反复来回一个一个新建之后内存就没了,所以网上的例子还是要改的。再讨论完下面另一个问题再附上同样的解决办法

另一个问题:

(背景“我主窗口是加载keras的h5模型去预测图片的,子窗口是一个widget窗口用来显示label二维码的)

为什么子窗口返回主窗口时还要加载h5模型及权重,不是因为我代码判断写对了才会返回主窗口从而不用再次加载模型和权重,而是因为一开始run文件,主窗口加载了模型和权重一次,而且进入子窗口widget我是hide主窗口的所以内存里面保留了这个信息,返回主窗口一样hide子窗口,此时是新的窗口,再执行一次,内存里面两个相同信息,就存入了cache,cache是提高访问速率,简单理解是访问多了,存入cache,每次去cache读取,会比cpu去获取内存里面的东西快的多。所以子窗口返回来的第三次才不会卡。

解决的办法是在子窗口用主窗口的东西,主窗口也用子窗口的东西.

主函数的初始化(部分代码)

class MyWindow(QMainWindow, Ui_MainWindow):  
    def __init__(self, parent=None): 
	    self.dia = Ui_Dialog1()
	    self.dia.DoNotShow = True
	    self.dia.log4 = self     # 这一句是核心,让自己全部self赋值给子窗口的log4了,子窗口只要self.log4.XX就可以调用主窗口的self.XX值
	    
	    # 以下五句话是定时器15ms执行一次连接ShowCameraOneImage函数的一次截图
        self.capture = cv2.VideoCapture(0)
        self.DoNotShow = False
        self.timer_camera = QTimer()
        self.timer_camera.start(15)  # 1000ms == 1s
        self.timer_camera.timeout.connect(self.ShowCameraOneOneImage)  # 连接槽函数ShowCameraOneImage

主窗口的一个槽函数wechat(),点击了就进图子窗口代码那边了(PS:子窗口那边也是用了定时器)

def wechat(self):
    self.DoNotShow = True  #  为了避免进入子窗口后主窗口还在抓取显示图片
    self.capture.release() # 释放主窗口的cv2.VideoCapture(0)
    self.hide()		# 隐藏此主窗口

    self.dia.show()				# 显示子窗口
    self.dia.DoNotShow = False
    self.dia.capture = cv2.VideoCapture(0)  # 子窗口的cv2.VideoCapture(0)显示		

子窗口返回时候

    if(self.jj==1):   # 这个只是我代码的一个判断机制
        self.capture.release()  
        self.DoNotShow = True
        self.hide()  # 隐藏此子窗口
        
        self.log4.show()  			# 显示主窗口
        self.log4.DoNotShow = False
        self.log4.capture = cv2.VideoCapture(0)	# 释放子窗口的cv2.VideoCapture(0)
        
		self.jj = 0   # 这句以及下面的都是为了清空主窗口的textEdit,lineEdit_2的值
        self.log4.textEdit.setText("") 
        self.log4.textEdit_2.setText("")
        self.log4.textEdit_3.setText("")
        self.log4.lineEdit.setText("")
        self.log4.lineEdit_2.setText("")
        self.log4.sum_price = 0
        self.log4.k = 1

仔细观察,前六行是一样的。
解决方法就是如此,懂思路就好,如果退出程序进入要加载数据,那么还是pickle把数据或者变量保存到一个文件,进入窗口就加载。
学到了今天

猜你喜欢

转载自blog.csdn.net/qq_38153833/article/details/86659322