PyQt5 / QSensor.start () иногда зависает на Android - PullRequest
0 голосов
/ 10 марта 2020

Я создаю игрушечное приложение 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.

...