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()

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to