ich suche schon länger nach einer Lösung und hoffe das ich hier eine Idee zu deren Lösung bekomme.
Ich steuere CANoe über die COM Schnittstelle fern und baue mir so einige Testumgebung auf, welche über mehrere Stunden laufen soll. Ich will dabei die Events von CANoe nutzen um auf bestimmte Änderungen zu reagieren. Als beispiel sei die Änderung einer Umgebungsvariablen genannt. Das ganze funktioniert als kleine demo Applikation schon. Ich will jetzt die verwendete MessageBox durch eine time.sleep() oder sowas ersetzen.
Leider ist die blockierend und die Events werden auch nicht mehr abgefangen.
Hier mein Testprogramm dazu:
Code: Alles auswählen
import win32com.client
import os
import time
from win32gui import MessageBox as msgbox
class Tester:
def __init__ (self):
self.__className = 'Tester'
print ('%s : call constructor' %self.__className)
def __del__ (self):
print ('%s : call destructor' %self.__className)
def OnChange (self, value):
print ('VariableEvents:OnChange now called with %s' %value)
def demo ():
appl = win32com.client.Dispatch ('CANoe.Application')
env = appl.Environment
var = env.GetVariable ('dtc_event')
env_event = win32com.client.WithEvents (var, Tester)
msgbox (0, "Finished the Test", "Info", 16)
demo()
Ich bin bis jetzt davon ausgegangen, daß die COM Events in einem extra Task laufen, was wohl bei python nicht so ist.
Ich habe bis jetzt versucht:
- Event Handler ein extra Tast mit threading
oder
- time.sleep() durch irgendeine while true: pass ersetzen
Leider ist dann auch wieder alle blockierend, zumal ein Task aktive sein muss und die run() Funktion den rest auch blockiert.
Ich möchte aber auch darauf achten, dass die Prozessor Last nicht zu hoch wird. Mit einer while True: pass Schleife kann ich schnell 25% CPU Load erzeugen.
Irgendwie bin ich da am verzweifeln und im Internet habe ich dazu auch keine gute Lösung gefunden.
Schon jetzt danke für die Antworten
Grüße, Bernd