内存泄漏 / Python Windows 7 截图

4

我在一个双屏幕系统(Windows7)上尝试了以下Python代码,来重复保存屏幕截图。

它生成了33张14.6MB的截图(总共482MB),然后崩溃了。使用Process Explorer检查后,我可以看到使用的内存量增加到了约500MB。

我的问题是如何停止内存泄漏?

import win32gui, win32ui, win32con, win32api
import time
import os


def 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 

我从这里获取了基础代码:Python在Windows 7上无需PIL进行截屏

1个回答

2

在保存位图后,您需要清理位图和DC,可以添加以下内容:

win32gui.DeleteObject(bmp.GetHandle())
memdc.DeleteDC()
srcdc.DeleteDC()
win32gui.ReleaseDC(hwin, hwindc) 

谢谢您的回答。在添加了您的清理代码后,它运行得非常完美。 - PythonAndPascal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接