События Consuming COM в Python

stackoverflow не что-то, с чего можно просто восстановиться, так как он не может выделить больше стековой памяти для ровного вызова обработчика исключений.

единственная вещь, которую можно действительно сделать, разыскивают причину и предотвращают его вообще (например, becareful с рекурсией, и не выделяйте большие объекты на стеке).

7
задан Monkpit 9 October 2015 в 19:03
поделиться

1 ответ

Я не автоматизировал Excel, но я использую некоторый код из Microsoft Speech API , который может быть достаточно похожим, чтобы вы начали:

ListenerBase = win32com.client.getevents("SAPI.SpInProcRecoContext")
class Listener(ListenerBase):
    def OnRecognition(self, _1, _2, _3, Result):
        """Callback whenever something is recognized."""
        # Work with Result

    def OnHypothesis(self, _1, _2, Result):
        """Callback whenever we have a potential match."""
        # Work with Result

затем позже в основной цикл:

    while not self.shutting_down.is_set():
        # Trigger the event handlers if we have anything.
        pythoncom.PumpWaitingMessages() 
        time.sleep(0.1) # Don't use up all our CPU checking constantly

Отредактируйте, чтобы получить более подробную информацию о главном цикле:

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

Если вы хотите сделать что-то еще, пока это происходит, вам придется запустить цикл в отдельном thread (см. модуль threading); в противном случае он может просто сидеть внизу вашего скрипта. В моем примере я запускал его в отдельном потоке, потому что у меня также был запущен графический интерфейс; переменная shutting_down является потоком. Событие, которое вы можете использовать, чтобы сказать циклическому потоку остановиться.

6
ответ дан 7 December 2019 в 10:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: