4

スクリーンショットを繰り返し保存するために、デュアル モニター システム (Windows7) で次の Python コードを試しました。14.6MB の 33 ショット (合計 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 

私はからベースコードを取得しました: PIL なしの Python Windows 7 スクリーンショット:

4

1 に答える 1

2

ビットマップを保存した後、次のようなものを追加して、ビットマップと DC をクリーンアップする必要があります。

win32gui.DeleteObject(bmp.GetHandle())
memdc.DeleteDC()
srcdc.DeleteDC()
win32gui.ReleaseDC(hwin, hwindc) 
于 2013-05-15T21:32:06.447 に答える