Я создаю игрушечное приложение PyQt5 для Android с pyqtdeploy , и в настоящее время я создаю экземпляр группы QtSensor.QSensor
и пытаюсь .start()
их.
Большую часть времени это работает отлично, но время от времени мое приложение зависает, когда я запускаю start()
на любом из датчиков.
Я использую только основной поток во всем приложении и, в конце концов, после всех датчиков При успешном запуске приложение работает как шарм.
Обновление :
- Похоже, что создание / запуск более одного датчика вызывает такое поведение, в то время как один только датчик никогда не зависает.
- Я пытался не запускать каждый экземпляр датчика в функции
__init__()
главного окна, а вызывать новый вызов для каждого экземпляра датчика / фильтра, но похоже, что теперь приложение зависает все чаще .. - Я также попытался не повторно использовать
QtSensors.QSensorFilter
, но создать новый класс фильтра для каждого датчика из его выделенного класса фильтра (например, QCompassFilter
, но без эффект ..
Кто-нибудь знает что-то, что я должен знать о предварительных условиях для start()
?
Я использую Qt 5.12.1 (встроенный), Android SDK / android -29, NDK r19 c, PyQt5.12.1
Вот как выглядит код: - в моем реальном примере я создаю кучу Датчики:
class GenericSensorFilter(QtSensors.QSensorFilter):
def __init__(self, widget):
super().__init__()
self.widget = widget
def filter(self, reading):
if isInstance(reading, QtSensors.QGyroscope:
result = {"x": reading.x(),
"y": reading.y(),
"z": reading.z()}
elif ..
QtCore.QMetaObject.invokeMethod(
self.widget, 'sensor_update',
QtCore.Qt.QueuedConnection,
QtCore.Q_ARG(dict, result))
return True
class SomeQtClass():
def init_sensor(self): # <= called by main thread
sensor = QtSensors.QGyroscope() # <= can be any other sensor
filter = GenericSensorFilter(self)
sensor.addFilter(filter)
if sensor.start(): # <= this hangs sometimes
... # <== store sensor / filter
@QtCore.pyqtSlot(dict)
def sensor_update(self, data):
... do_something..
Примечание: запуск собственного PyQt5 на Linux не приводит к такому поведению - по крайней мере, на моей машине, скорее всего потому, что можно запустить только два датчика и они не производят обновления , Чтобы воспроизвести ошибку, вам нужно создать приложение Android.