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