Ошибка SendKeys после 2 запусков в потоке

Python и SendKeys

import SendKeys, threading, pyHook, pythoncom
class Auto(threading.Thread):
    def run(self):
        SendKeys.SendKeys("{ENTER}",pause=0.1);
        print('Sent');
        exit();
def OnKeyboardEvent(event):
    if event.Ascii == 22:
        Auto().start();
    return True
        
hm = pyHook.HookManager()
hm.KeyDown = OnKeyboardEvent
hm.HookKeyboard()
pythoncom.PumpMessages()

По какой-то причине эта программа дает сбой после запуска ровно два раза, я понятия не имею, в чем причина этого. Когда вы закомментируете часть SendKeys, программа работает нормально, поэтому проблема должна быть в ключах отправки.

[править] Кроме того, чтобы уточнить, запуск SendKeys.SendKeys(...) в for i в диапазоне (0,100) работает, поэтому я предполагаю, что это как-то связано с потоком. Я никогда раньше не программировал потоки. Кроме того, это просто пример макета для воспроизведения проблемы.

Я работаю на Windows 7, Python2.6

[edit]Кроме того, программа не «глючит», а просто зависает (функция вообще не запускается, она просто сидит там)


person user202459    schedule 23.12.2009    source источник


Ответы (2)


Кажется, что SendKeys является потокобезопасным. Следующий код работает в Vista — Python 2.6

class Auto(threading.Thread):
    def run(self):
        SendKeys.SendKeys("#",pause=0.1);
        print('Sent');
        exit();

for i in xrange(30):
    Auto().start()

Возможно, проблема связана с некоторыми вмешательствами в PyHook или механизм Windows PumpMessage. Вы пытались поместить часть SendKeys в другой процесс, а не в другой поток?

Я надеюсь, что это помогает

person luc    schedule 23.12.2009
comment
Я только что попытался сделать это с помощью модуля «многопроцессорность» и создать новый процесс, но у меня все еще возникает точно такая же проблема. Не знаю, почему это работает в первый раз, но не во второй раз. Может, мне что-то закрыть? Я просто предполагаю, что это может быть что-то вроде открытия файла в python и не закрытия его после запуска программы для других процессов для редактирования этого файла или чего-то подобного. - person user202459; 23.12.2009

Я не очень уверен в программе, но если вы поместите exit(); в середине программы, она полностью закроет программу.

Итак, не могли бы вы попробовать без exit();?

person YOU    schedule 23.12.2009
comment
Я думал, что это только закроет поток? Но я попробовал, и ничего не изменилось. - person user202459; 23.12.2009
comment
хорошо, кстати, приведенные выше коды - это полная программа? Я не вижу резьбовую часть. - person YOU; 23.12.2009