From 89989ab79dd66f2cbc6475266a4e34bdd49f1b00 Mon Sep 17 00:00:00 2001 From: Vinicius Moreira Date: Thu, 25 Jun 2020 14:48:50 -0300 Subject: [PATCH] [fix][ui] using the sleep function wrongly within the Qt threads --- CHANGELOG.md | 1 + bauh/gems/appimage/worker.py | 4 ++-- bauh/view/qt/components.py | 15 +++++---------- bauh/view/qt/prepare.py | 9 ++++----- bauh/view/qt/thread.py | 21 +++++++++++---------- bauh/view/qt/window.py | 8 ++------ 6 files changed, 25 insertions(+), 33 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b82cb281..94c38fb0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -42,6 +42,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - not calling initial required tasks after enabling a new package type on settings - not updating the type filters if only one type is available after refreshing the table - displaying the type filters on the search results when there is only one type available after some actions finish + - using the sleep function wrongly within the Qt threads (causes random crashes) - minor fixes - Tray - update notifications not working on Ubuntu 18.04 diff --git a/bauh/gems/appimage/worker.py b/bauh/gems/appimage/worker.py index 7ffe047f..8936c52d 100644 --- a/bauh/gems/appimage/worker.py +++ b/bauh/gems/appimage/worker.py @@ -27,7 +27,7 @@ class DatabaseUpdater(Thread): self.http_client = http_client self.logger = logger self.db_locks = db_locks - self.sleep = interval + self.sleep_time = interval self.i18n = i18n self.task_man = task_man self.task_id = 'appim_db' @@ -103,7 +103,7 @@ class DatabaseUpdater(Thread): while True: self.download_databases() self.logger.info('Sleeping') - time.sleep(self.sleep) + time.sleep(self.sleep_time) class SymlinksVerifier(Thread): diff --git a/bauh/view/qt/components.py b/bauh/view/qt/components.py index edfbf984..16f1e159 100644 --- a/bauh/view/qt/components.py +++ b/bauh/view/qt/components.py @@ -1,11 +1,9 @@ import os -import time import traceback from pathlib import Path -from threading import Thread from typing import Tuple, Dict, Optional, Set -from PyQt5.QtCore import Qt, QSize +from PyQt5.QtCore import Qt, QSize, QTimer from PyQt5.QtGui import QIcon, QPixmap, QIntValidator, QCursor from PyQt5.QtWidgets import QRadioButton, QGroupBox, QCheckBox, QComboBox, QGridLayout, QWidget, \ QLabel, QSizePolicy, QLineEdit, QToolButton, QHBoxLayout, QFormLayout, QFileDialog, QTabWidget, QVBoxLayout, \ @@ -600,26 +598,23 @@ class InputFilter(QLineEdit): super(InputFilter, self).__init__() self.on_key_press = on_key_press self.last_text = '' - self.typing = None + self.typing = QTimer() + self.typing.timeout.connect(self.notify_text_change) def notify_text_change(self): - time.sleep(2) text = self.text().strip() if text != self.last_text: self.last_text = text self.on_key_press() - self.typing = None - def keyPressEvent(self, event): super(InputFilter, self).keyPressEvent(event) - if self.typing: + if self.typing.isActive(): return - self.typing = Thread(target=self.notify_text_change, daemon=True) - self.typing.start() + self.typing.start(2000) def get_text(self): return self.last_text diff --git a/bauh/view/qt/prepare.py b/bauh/view/qt/prepare.py index c3ccad04..04d6c04d 100644 --- a/bauh/view/qt/prepare.py +++ b/bauh/view/qt/prepare.py @@ -1,6 +1,5 @@ import datetime import operator -import time from functools import reduce from typing import Tuple @@ -42,7 +41,7 @@ class Prepare(QThread, TaskManager): self.signal_ask_password.emit() while self.waiting_password: - time.sleep(0.1) # waiting for user input + self.msleep(100) # waiting for user input return self.password_response @@ -83,12 +82,12 @@ class CheckFinished(QThread): self.finished = None def run(self): - time.sleep(3) + self.sleep(3) while True: if self.total == self.finished: break - time.sleep(0.01) + self.msleep(10) self.signal_finished.emit() @@ -112,7 +111,7 @@ class EnableSkip(QThread): self.signal_timeout.emit() break - time.sleep(0.1) + self.msleep(100) class PreparePanel(QWidget, TaskManager): diff --git a/bauh/view/qt/thread.py b/bauh/view/qt/thread.py index 5688edb0..9d2d638e 100644 --- a/bauh/view/qt/thread.py +++ b/bauh/view/qt/thread.py @@ -1,14 +1,15 @@ import os import re -import requests import time import traceback -from PyQt5.QtCore import QThread, pyqtSignal from datetime import datetime, timedelta from io import StringIO from pathlib import Path from typing import List, Type, Set, Tuple +import requests +from PyQt5.QtCore import QThread, pyqtSignal + from bauh import LOGS_PATH from bauh.api.abstract.cache import MemoryCache from bauh.api.abstract.controller import SoftwareManager, UpgradeRequirement, UpgradeRequirements @@ -73,7 +74,7 @@ class AsyncAction(QThread, ProcessWatcher): def wait_user(self): while self.wait_confirmation: - time.sleep(0.01) + self.msleep(10) def print(self, msg: str): if msg: @@ -670,7 +671,7 @@ class AnimateProgress(QThread): self.increment = 5 self.stop = False self.limit = 100 - self.sleep = 0.05 + self.wait_time = 50 self.last_progress = 0 self.manual = False self.paused = False @@ -680,7 +681,7 @@ class AnimateProgress(QThread): self.increment = 5 self.stop = False self.limit = 100 - self.sleep = 0.05 + self.wait_time = 50 self.last_progress = 0 self.manual = False self.paused = False @@ -724,7 +725,7 @@ class AnimateProgress(QThread): self.progress_value += current_increment - time.sleep(self.sleep) + super(AnimateProgress, self).msleep(self.wait_time) self.signal_change.emit(100) self._reset() @@ -766,7 +767,7 @@ class NotifyPackagesReady(QThread): if not to_verify: break - time.sleep(0.1) + self.msleep(100) self.pkgs = None self.work = True @@ -787,7 +788,7 @@ class NotifyInstalledLoaded(QThread): self.loaded = True def run(self): - time.sleep(0.1) + self.msleep(100) self.signal_loaded.emit() @@ -828,7 +829,7 @@ class LaunchPackage(AsyncAction): def run(self): if self.pkg: try: - time.sleep(0.25) + super(LaunchPackage, self).msleep(250) self.manager.launch(self.pkg.model) self.notify_finished(True) except: @@ -911,7 +912,7 @@ class ApplyFilters(AsyncAction): self.signal_table.emit(pkgs_info) while self.wait_table_update: - time.sleep(0.005) + super(ApplyFilters, self).msleep(5) self.notify_finished() diff --git a/bauh/view/qt/window.py b/bauh/view/qt/window.py index dc9976d6..08c85c04 100755 --- a/bauh/view/qt/window.py +++ b/bauh/view/qt/window.py @@ -1,4 +1,4 @@ -import datetime +import logging import logging import operator import time @@ -507,11 +507,7 @@ class ManageWindow(QWidget): def stop_notifying_package_states(self): if self.thread_notify_pkgs_ready.isRunning(): self.signal_stop_notifying.emit() - - expires_at = datetime.datetime.now() + datetime.timedelta(seconds=5) - - while datetime.datetime.now() < expires_at and self.thread_notify_pkgs_ready.isRunning(): - time.sleep(0.1) + self.thread_notify_pkgs_ready.wait(1000) def _update_table_and_upgrades(self, pkgs_info: dict): self._update_table(pkgs_info=pkgs_info, signal=True)