[fix][ui] using the sleep function wrongly within the Qt threads

This commit is contained in:
Vinicius Moreira
2020-06-25 14:48:50 -03:00
parent 9d86c97a80
commit 89989ab79d
6 changed files with 25 additions and 33 deletions

View File

@@ -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 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 - 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 - 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 - minor fixes
- Tray - Tray
- update notifications not working on Ubuntu 18.04 - update notifications not working on Ubuntu 18.04

View File

@@ -27,7 +27,7 @@ class DatabaseUpdater(Thread):
self.http_client = http_client self.http_client = http_client
self.logger = logger self.logger = logger
self.db_locks = db_locks self.db_locks = db_locks
self.sleep = interval self.sleep_time = interval
self.i18n = i18n self.i18n = i18n
self.task_man = task_man self.task_man = task_man
self.task_id = 'appim_db' self.task_id = 'appim_db'
@@ -103,7 +103,7 @@ class DatabaseUpdater(Thread):
while True: while True:
self.download_databases() self.download_databases()
self.logger.info('Sleeping') self.logger.info('Sleeping')
time.sleep(self.sleep) time.sleep(self.sleep_time)
class SymlinksVerifier(Thread): class SymlinksVerifier(Thread):

View File

@@ -1,11 +1,9 @@
import os import os
import time
import traceback import traceback
from pathlib import Path from pathlib import Path
from threading import Thread
from typing import Tuple, Dict, Optional, Set 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.QtGui import QIcon, QPixmap, QIntValidator, QCursor
from PyQt5.QtWidgets import QRadioButton, QGroupBox, QCheckBox, QComboBox, QGridLayout, QWidget, \ from PyQt5.QtWidgets import QRadioButton, QGroupBox, QCheckBox, QComboBox, QGridLayout, QWidget, \
QLabel, QSizePolicy, QLineEdit, QToolButton, QHBoxLayout, QFormLayout, QFileDialog, QTabWidget, QVBoxLayout, \ QLabel, QSizePolicy, QLineEdit, QToolButton, QHBoxLayout, QFormLayout, QFileDialog, QTabWidget, QVBoxLayout, \
@@ -600,26 +598,23 @@ class InputFilter(QLineEdit):
super(InputFilter, self).__init__() super(InputFilter, self).__init__()
self.on_key_press = on_key_press self.on_key_press = on_key_press
self.last_text = '' self.last_text = ''
self.typing = None self.typing = QTimer()
self.typing.timeout.connect(self.notify_text_change)
def notify_text_change(self): def notify_text_change(self):
time.sleep(2)
text = self.text().strip() text = self.text().strip()
if text != self.last_text: if text != self.last_text:
self.last_text = text self.last_text = text
self.on_key_press() self.on_key_press()
self.typing = None
def keyPressEvent(self, event): def keyPressEvent(self, event):
super(InputFilter, self).keyPressEvent(event) super(InputFilter, self).keyPressEvent(event)
if self.typing: if self.typing.isActive():
return return
self.typing = Thread(target=self.notify_text_change, daemon=True) self.typing.start(2000)
self.typing.start()
def get_text(self): def get_text(self):
return self.last_text return self.last_text

View File

@@ -1,6 +1,5 @@
import datetime import datetime
import operator import operator
import time
from functools import reduce from functools import reduce
from typing import Tuple from typing import Tuple
@@ -42,7 +41,7 @@ class Prepare(QThread, TaskManager):
self.signal_ask_password.emit() self.signal_ask_password.emit()
while self.waiting_password: while self.waiting_password:
time.sleep(0.1) # waiting for user input self.msleep(100) # waiting for user input
return self.password_response return self.password_response
@@ -83,12 +82,12 @@ class CheckFinished(QThread):
self.finished = None self.finished = None
def run(self): def run(self):
time.sleep(3) self.sleep(3)
while True: while True:
if self.total == self.finished: if self.total == self.finished:
break break
time.sleep(0.01) self.msleep(10)
self.signal_finished.emit() self.signal_finished.emit()
@@ -112,7 +111,7 @@ class EnableSkip(QThread):
self.signal_timeout.emit() self.signal_timeout.emit()
break break
time.sleep(0.1) self.msleep(100)
class PreparePanel(QWidget, TaskManager): class PreparePanel(QWidget, TaskManager):

View File

@@ -1,14 +1,15 @@
import os import os
import re import re
import requests
import time import time
import traceback import traceback
from PyQt5.QtCore import QThread, pyqtSignal
from datetime import datetime, timedelta from datetime import datetime, timedelta
from io import StringIO from io import StringIO
from pathlib import Path from pathlib import Path
from typing import List, Type, Set, Tuple from typing import List, Type, Set, Tuple
import requests
from PyQt5.QtCore import QThread, pyqtSignal
from bauh import LOGS_PATH from bauh import LOGS_PATH
from bauh.api.abstract.cache import MemoryCache from bauh.api.abstract.cache import MemoryCache
from bauh.api.abstract.controller import SoftwareManager, UpgradeRequirement, UpgradeRequirements from bauh.api.abstract.controller import SoftwareManager, UpgradeRequirement, UpgradeRequirements
@@ -73,7 +74,7 @@ class AsyncAction(QThread, ProcessWatcher):
def wait_user(self): def wait_user(self):
while self.wait_confirmation: while self.wait_confirmation:
time.sleep(0.01) self.msleep(10)
def print(self, msg: str): def print(self, msg: str):
if msg: if msg:
@@ -670,7 +671,7 @@ class AnimateProgress(QThread):
self.increment = 5 self.increment = 5
self.stop = False self.stop = False
self.limit = 100 self.limit = 100
self.sleep = 0.05 self.wait_time = 50
self.last_progress = 0 self.last_progress = 0
self.manual = False self.manual = False
self.paused = False self.paused = False
@@ -680,7 +681,7 @@ class AnimateProgress(QThread):
self.increment = 5 self.increment = 5
self.stop = False self.stop = False
self.limit = 100 self.limit = 100
self.sleep = 0.05 self.wait_time = 50
self.last_progress = 0 self.last_progress = 0
self.manual = False self.manual = False
self.paused = False self.paused = False
@@ -724,7 +725,7 @@ class AnimateProgress(QThread):
self.progress_value += current_increment self.progress_value += current_increment
time.sleep(self.sleep) super(AnimateProgress, self).msleep(self.wait_time)
self.signal_change.emit(100) self.signal_change.emit(100)
self._reset() self._reset()
@@ -766,7 +767,7 @@ class NotifyPackagesReady(QThread):
if not to_verify: if not to_verify:
break break
time.sleep(0.1) self.msleep(100)
self.pkgs = None self.pkgs = None
self.work = True self.work = True
@@ -787,7 +788,7 @@ class NotifyInstalledLoaded(QThread):
self.loaded = True self.loaded = True
def run(self): def run(self):
time.sleep(0.1) self.msleep(100)
self.signal_loaded.emit() self.signal_loaded.emit()
@@ -828,7 +829,7 @@ class LaunchPackage(AsyncAction):
def run(self): def run(self):
if self.pkg: if self.pkg:
try: try:
time.sleep(0.25) super(LaunchPackage, self).msleep(250)
self.manager.launch(self.pkg.model) self.manager.launch(self.pkg.model)
self.notify_finished(True) self.notify_finished(True)
except: except:
@@ -911,7 +912,7 @@ class ApplyFilters(AsyncAction):
self.signal_table.emit(pkgs_info) self.signal_table.emit(pkgs_info)
while self.wait_table_update: while self.wait_table_update:
time.sleep(0.005) super(ApplyFilters, self).msleep(5)
self.notify_finished() self.notify_finished()

View File

@@ -1,4 +1,4 @@
import datetime import logging
import logging import logging
import operator import operator
import time import time
@@ -507,11 +507,7 @@ class ManageWindow(QWidget):
def stop_notifying_package_states(self): def stop_notifying_package_states(self):
if self.thread_notify_pkgs_ready.isRunning(): if self.thread_notify_pkgs_ready.isRunning():
self.signal_stop_notifying.emit() self.signal_stop_notifying.emit()
self.thread_notify_pkgs_ready.wait(1000)
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)
def _update_table_and_upgrades(self, pkgs_info: dict): def _update_table_and_upgrades(self, pkgs_info: dict):
self._update_table(pkgs_info=pkgs_info, signal=True) self._update_table(pkgs_info=pkgs_info, signal=True)