为了账号安全,请及时绑定邮箱和手机立即绑定

内存泄漏/ Python Windows 7屏幕截图

内存泄漏/ Python Windows 7屏幕截图

守候你守候我 2021-03-15 12:12:23
我已经在双显示器系统(Windows7)上尝试以下Python代码来重复保存屏幕截图。它生成33张14.6MB(总共482MB)的照片,然后崩溃。使用Process Explorer进行检查,我可以看到已用内存量增加到约500MB。我的问题是如何阻止内存泄漏?import win32gui, win32ui, win32con, win32apiimport timeimport osdef my_capture(file_name):    hwin = win32gui.GetDesktopWindow()    width = win32api.GetSystemMetrics(win32con.SM_CXVIRTUALSCREEN)    height = win32api.GetSystemMetrics(win32con.SM_CYVIRTUALSCREEN)    left = win32api.GetSystemMetrics(win32con.SM_XVIRTUALSCREEN)    top = win32api.GetSystemMetrics(win32con.SM_YVIRTUALSCREEN)    hwindc = win32gui.GetWindowDC(hwin)    srcdc = win32ui.CreateDCFromHandle(hwindc)    memdc = srcdc.CreateCompatibleDC()    bmp = win32ui.CreateBitmap()        bmp.CreateCompatibleBitmap(srcdc, width, height)    memdc.SelectObject(bmp)    memdc.BitBlt((0, 0), (width, height), srcdc, (left, top), win32con.SRCCOPY)    bmp.SaveBitmapFile(memdc, file_name) # 'screenshot.bmp'def captureAndSave(i):    if i < 10:        tmpStr = "00000" + str(i)    elif i < 100:        tmpStr = "0000" + str(i)    elif i < 1000:        tmpStr = "000" + str(i)    elif i < 10000:        tmpStr = "00" + str(i)    elif i < 100000:        tmpStr = "0" + str(i)    else:        tmpStr = str(i)    my_capture(tmpStr + '.bmp')def myMainLoop():    i = 0    while 1:        i = i + 1        captureAndSave(i)        time.sleep(0.2)#-----------------------------------------------------------------------------if __name__ == '__main__':    try:        myMainLoop()        # capure all monitor windows    except KeyboardInterrupt:        pass 
查看完整描述

1 回答

?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

您将需要清理位图和DC,在位图保存后添加类似的内容。


win32gui.DeleteObject(bmp.GetHandle())

memdc.DeleteDC()

srcdc.DeleteDC()

win32gui.ReleaseDC(hwin, hwindc) 


查看完整回答
反对 回复 2021-03-24
  • 1 回答
  • 0 关注
  • 179 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号