我有一个控制机器人的控制器类(通过串行接口连接)。此控制器附加到视图。除此之外,我还有一个派生的线程,QThread
它会定期读出机器人的状态。
读取状态不得与从用户界面触发的机器人命令发生冲突。因此,我使用互斥锁锁定了每个机器人的访问权限,QMutexLocker
但是如果执行了这样的互斥锁块,这会导致我的用户界面冻结。
class RobotControl(QObject):
def __init__(self, view):
super(RobotControl, self).__init__()
self.view = view
self.updatethread = UpdatePositionAndStatus(self.robot)
self.mutex = QMutex()
self.connect(self.updatethread, SIGNAL("updateStatus( QString ) "), self.print_error)
self.updatethread.start()
@pyqtSlot()
def init_robot(self):
"""
Initializes the serial interface to the robot interface and checks if
there is really a robot interface available.
"""
with QMutexLocker(self.mutex):
# Open interface
try:
index = self.view.robotcontrolui.get_selected_interface_index()
interface = self.interfaces.item(index).text()
self.robot = RobotController(interface)
except DeviceError:
self.view.error_dlg(self.tr("Couldn't open interface {0}!".format(interface)))
self.robot = None
return
# Check if there is really a robot interface on the selected serial
# interface with trying to read status byte
try:
self.robot.status()
except DeviceError:
# In case of failure release interface
self.close_robot()
self.view.error_dlg(self.tr("Couldn't initialize robot interface!"))
return
self.view.robotcontrolui.bt_open_interface.setEnabled(False)
self.view.robotcontrolui.bt_close_interface.setEnabled(True)
class UpdatePositionAndStatus(QThread):
def __init__(self, robot, parent=None):
QThread.__init__(self, parent)
self.robot = robot
self.mutex = QMutex()
def run(self):
"""
This function continously reads out the position and the status to for
updating it on the userinterface.
"""
try:
while True:
if self.robot is not None:
# Do robot communication under a lock
self.mutex.lock()
(_, rel_pos) = self.robot.read_position()
status = self.robot.status()
self.mutex.unlock()
# Display position and status on userinterface
self.view.robotcontrolui.update_position_and_status(rel_pos, status)
# Wait 1 seccond for next update
QThread.sleep(1.0)
except DeviceError:
# Release lock on robot
self.mutex.unlock()
self.emit(SIGNAL("updateStatus( QString )"), self.tr("Error while updating current position and status!"))
触发 init 方法后,用户界面冻结,程序崩溃:为什么会这样?我怎样才能避免这种情况?