On Friday, March 22, 2013 at 11:43:50 PM UTC+5:30, Jan wrote: > Dear Usenet readers, > > Our company wants to implement about 40 biometric access control devices > which have a proprietary DLL with a COM object in it. > > I've done some research about COM objects and how to use them. > Now, I need to connect to every device separately and register for real > time events. So, I need about 40 instances of the COM object > simultaneously connected and registered to catch all events of all devices. > > I assumed I needed threading for this, and I have done a simple > implementation. > > All I want to ask is: Does anybody see something that I could have done > in a better way? I'm new to COM objects in Python! > > The program runs fine, it is very basic and I tested it with 3 devices > connected at the same time. In production this will be 40! > > Thanks in advance > > Jan > > Source code: > > # Based on eventappartmentthreading from the win32com demo > > import sys, os, time > import win32com.client > import win32api > import win32event > # sys.coinit_flags not set, so pythoncom initializes apartment-threaded. > import pythoncom > from threading import Thread > > threadlist = dict() # this stores the device ids > # using the threadid as the key field > > class ZkEvents: > def __init__(self): > self.event = win32event.CreateEvent(None, 0, 0, None) > thread = win32api.GetCurrentThreadId() > print "thread %s " % thread > > self.dev_id = threadlist[thread] > print "Thread Connected For ID %s " % self.dev_id > > def OnFinger(self): > print self.dev_id, > print "OnFinger" > > def OnVerify(self, iUserID=pythoncom.Empty): > print self.dev_id, > print "OnVerify: %s" % iUserID > > def OnKeyPress(self, iKey=pythoncom.Empty): > print self.dev_id, > print "KeyPress: %s" % iKey > > def WaitWhileProcessingMessages(event, timeout = 60): > start = time.clock() > while True: > # Wake 4 times a second - we can't just specify the > # full timeout here, as then it would reset for every > # message we process. > rc = win32event.MsgWaitForMultipleObjects( (event,), 0, > 250, > win32event.QS_ALLEVENTS) > if rc == win32event.WAIT_OBJECT_0: > # event signalled - stop now! > return True > if (time.clock() - start) > timeout: > # Timeout expired. > return False > # must be a message. > pythoncom.PumpWaitingMessages() > > def TestZkEvents(ip, dev_id): > thread = win32api.GetCurrentThreadId() > print 'TestZkEvents created ZK object on thread %d'%thread > threadlist[thread] = dev_id > > pythoncom.CoInitialize() > zk = win32com.client.DispatchWithEvents("zkemkeeper.ZKEM", ZkEvents) > > if zk.Connect_Net(ip, 4370): > print "Connect %s OK" % ip > else: > print "Connect %s Failed" % ip > try: > if zk.RegEvent(1, 65535): # 65535 = register for all events > print "RegEvent %s, %s OK" % (ip, dev_id) > else: > print "RegEvent %s, %s Failed" % (ip, dev_id) > except pythoncom.com_error, details: > print "Warning - could not open the test HTML file", details > > # Wait for the event to be signaled while pumping messages. > while True: > if not WaitWhileProcessingMessages(zk.event): > print "No Events From %s During Last Minute" % dev_id > > zk = None > > if __name__=='__main__': > # this should be a for loop with database fields... > t1 = Thread(target=TestZkEvents, args=('192.168.1.211',40)) > t1.start() > > t2 = Thread(target=TestZkEvents, args=('192.168.1.212',45)) > t2.start() > > t3 = Thread(target=TestZkEvents, args=('192.168.1.213',49)) > t3.start()
I Found This Error Plz Help, File "C:\Python27\pyt32\lib\threading.py", line 801, in __bootstrap_inner self.run() File "C:\Python27\pyt32\lib\threading.py", line 754, in run self.__target(*self.__args, **self.__kwargs) File "C:\Users\Kasim-SCS\Desktop\hk\zkem\v10_biometric_ERPpeek.py", line 266, in TestZkEvents zk = DispatchWithEvents("zkemkeeper.ZKEM", ZkEvents) File "C:\Python27\pyt32\lib\site-packages\win32com\client\__init__.py", line 2 53, in DispatchWithEvents disp = Dispatch(clsid) File "C:\Python27\pyt32\lib\site-packages\win32com\client\__init__.py", line 9 5, in Dispatch dispatch, userName = dynamic._GetGoodDispatchAndUserName(dispatch,userName,c lsctx) File "C:\Python27\pyt32\lib\site-packages\win32com\client\dynamic.py", line 11 4, in _GetGoodDispatchAndUserName return (_GetGoodDispatch(IDispatch, clsctx), userName) File "C:\Python27\pyt32\lib\site-packages\win32com\client\dynamic.py", line 91 , in _GetGoodDispatch IDispatch = pythoncom.CoCreateInstance(IDispatch, None, clsctx, pythoncom.II D_IDispatch) com_error: (-2147221005, 'Invalid class string', None, None) How To Solve DispatchWithEnvent Error ?? -- https://mail.python.org/mailman/listinfo/python-list