4

我已經嘗試在雙監視器系統(Windows7)以下的Python代碼重複保存屏幕截圖。 它產生了14.6MB(共482MB)的33個鏡頭,然後崩潰。使用Process Explorer進行檢查我可以看到已使用的內存量增加到大約500MB。內存泄露/ Python的Windows 7截圖

我的問題是如何阻止內存泄漏?

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 screenshot without PIL

回答

2

你要清理你的位圖和DC,位圖保存後加入這樣的事情;

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

謝謝你的回答。它在添加清理代碼後工作得很好。 – PythonAndPascal