The answer is: Just read carefully about QEvent and QCoreApplication.postEvent and you've know that there is no need to use QWaitCondition at all in this case.
On Tue, Dec 1, 2009 at 10:15 PM, Ruslan Popov <[email protected]>wrote: > Hi, all. > > I am working on a part of application, the app needs to read RFID id from > label, RFID reader is accessible via COM port (I've used pyserial for that). > > I have tried to do so: > > [main code] > class MainWindow(QMainWindow): > > def __init__(self, parent=None): > QMainWindow.__init__(self, parent) > > self.rfidReader = QWaitCondition() > self.rfidWaiter = QWaitCondition() > self.rfidMutex = QMutex() > self.callback = self.readedRFID > self.reader = WaitingRFID(self) > self.reader.start() > > .. > > def waitingRFID(self): > self.rfidReader.wakeAll() > > self.dlg = DlgWaitingRFID() > self.dlg.setModal(True) > self.dlg.exec_() > > #self.rfidMutex.lock() > #self.rfidWaiter.wait(self.rfidMutex) > #self.rfidMutex.unlock() > > def readedRFID(self, rfid): > self.rfid_id = rfid > print 'readedRFID:', rfid > #self.rfidWaiter.wakeAll() > self.dlg.close() > > [Thread code] > class WaitingRFID(QThread): > def __init__(self, parent): > self.callback = parent.callback > self.mutex = parent.rfidMutex > self.condition = parent.rfidReader > QThread.__init__(self) > > def hex(self, symbol): > return '%02X' % ord(symbol) > > def run(self): > while True: > port = serial.Serial(PORT['name'], PORT['rate'], > bytesize = PORT['bits_in_byte'], > parity = PORT['parity'], > stopbits = PORT['stop_bits'] > ) > port.setDTR(True) > port.setRTS(True) > > self.mutex.lock() > self.condition.wait(self.mutex) > > buffer = [] > while True: > symbol = port.read(1) > if not self.hex(symbol) == '0D': > buffer.append(symbol) > else: > if '0A' == self.hex(port.read(1)): > if len(buffer) == 9: > rfid_code = ''.join(buffer[1:]) # see > manager.py > break > buffer = [] > > self.callback(rfid_code) > self.mutex.unlock() > > port.close() > > Thread code works well. The problem is in showing dialog. > I need to show dialog with a label 'Put RFID label on the reader.' and run > thread's loop. The loop reads RFID id and use callback function. At this > point I need to close the dialog window. Tell me the right way to do it. > > Any help appreciated, > -- > Ruslan Popov > phone: +7 916 926 1205 > > -- Ruslan Popov phone: +7 916 926 1205
_______________________________________________ PyQt mailing list [email protected] http://www.riverbankcomputing.com/mailman/listinfo/pyqt
