pywin32 win32gui GetPixel завершается неудачно предсказуемо около 10000-го вызова

При выполнении следующего блока кода GetPixel начинает каждый раз выдавать ошибки примерно на 10000-м вызове. Если я помещу код в оператор try-exc, и все вызовы после первоначального сбоя завершатся неудачно. Единственный способ восстановить это завершить скрипт и запустить его снова. Я пытался поспать между звонками. Я попытался запустить сборку мусора между вызовами. Я попытался запустить сценарий из IDE и как отдельный процесс. Есть идеи? Даже запуск скрипта и сообщение о том, если / когда он потерпит неудачу, поможет.

import gc
import os
import time
import win32api, win32con, win32gui
import sys
import win32com.client

terms = 0

def get_pixel_colour(i_x, i_y):
    i_desktop_window_id = win32gui.GetDesktopWindow()
    i_desktop_window_dc = win32gui.GetWindowDC(i_desktop_window_id)
    long_colour = win32gui.GetPixel(i_desktop_window_dc, i_x, i_y)
    i_colour = int(long_colour)
    return (i_colour & 0xff), ((i_colour >> 8) & 0xff), ((i_colour >> 16) & 0xff)


for x in range (0, 1000000):
    colour = get_pixel_colour(500, 500)
    terms = terms + 1
    print terms

Ошибка, которая возвращается

error: (0, 'GetPixel', 'No error message is available')

1 ответ

Я подозреваю, что ресурсы не освобождаются, когда объект i_desktop_windw_dc собирается мусором. Может быть, нужен вызов releaseDC, но я не смог найти документы или исходный код после короткого поиска в моей системе после установки pywin32. Я вижу функцию ReleaseDC в win32gui, и я могу только догадываться, что вы должны использовать ее для освобождения контекста устройства, который вы получили через win32gui.GetWindowDC.

Это может быть обходной путь:

import gc
import os
import time
import win32api, win32con, win32gui
import sys
import win32com.client

terms = 0
class DesktopWindow(object):
    def __init__(self, *args, **kwargs):
        self.window_id = win32gui.GetDesktopWindow()
        self.window_dc = win32gui.GetWindowDC(self.window_id)
        pass
    def get_pixel_color(self, i_x, i_y):
        long_colour = win32gui.GetPixel(self.window_dc, i_x, i_y)
        i_colour = int(long_colour)
        return (i_colour & 0xff, (i_colour >> 8) & 0xff,
                (i_colour >> 16) & 0xff)

dtop = DesktopWindow()

for x in range (0, 1000000):
    colour = dtop.get_pixel_color(500, 500)
    terms = terms + 1
    if terms % 100 == 0:
        print terms

Это радостно передает 200000 операций get_pixel_color здесь, когда я печатаю.

Также попробуйте win32gui.ReleaseDC(i_desktop_window_id, i_desktop_window_dc) в конце вашей автономной функции, и посмотрите, поможет ли это. (Это то, что вы должны делать в кодировке WinAPI... освободите DC, как только закончите.)

Примечание: выше фиксированного... вам нужен дескриптор окна (hWnd= идентификатор окна) и дескриптор контекста устройства (hDC) при вызове ReleaseDC. См. http://msdn.microsoft.com/en-us/library/windows/desktop/dd162920%28v=vs.85%29.aspx

Другие вопросы по тегам