У меня есть GUI и программная логика, написанная на Python. Я запрашиваю информацию из Интернета, вызывая частое сообщение urllib.requests
(и т. Д.), И это вызывает проблему, когда GUI не отвечает, но эти вызовы завернуты в QThread
. Я думаю, что это происходит из-за GIL
. Но как я могу использовать QThread
в приложении PyQt, какое использование его в PyQt
, если я не могу сделать код для работы асинхронно?PyQt, QThread, GIL, GUI
--The code--
qtthreaddecorator.py:
from PyQt4 import QtCore
class Worker(QtCore.QThread):
def __init__(self, thread_name, finished_slot, function, *args, **kwargs):
QtCore.QThread.__init__(self)
self._thread_name = thread_name
self._function = function
self._args = args
self._kwargs = kwargs
self._finished_slot = finished_slot
def run(self):
self._function(*self._args, **self._kwargs)
self._finished_slot()
return
def qt_thread_decorator(slot):
def decorator(function):
def wrapper(*args, **kwargs):
worker = Worker(function.__name__, slot, function, *args, **kwargs)
worker.start()
return
return wrapper
return decorator
и место, где я использую его:
import qtthreaddecorator
class MainWindow(QtGui.QMainWindow, form_class):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self, parent)
self.setupUi(self)
self.init()
def init(self):
@qtthreaddecorator.qt_thread_decorator(self._fill_servers)
def _get_servers():
self._get_my_servers()
@qtthreaddecorator.qt_thread_decorator(self._fill_user_info)
def _get_user_info():
self._get_user_info()
_get_servers()
_get_user_info()
В моем случае, _get_servers()
и _get_user_info()
звонки в порядке, но я хотите выполнить их одновременно.
Вы начинаете нить правильно, например, используя 'worker_thread.start()'? Потому что, если вы выполняете 'worker_thread.run()', он будет работать. Просто не в другой теме. – Fenikso
Точно worker_thread.start(). Подождите, я отправлю код. –
Интересное использование декораторов ... Не могли бы вы создать небольшой runnable пример с кнопкой, запускающей некоторый сон в другом потоке? Или я могу ответить на ваш вопрос рабочим примером, но я не уверен, ответит ли он на ваш вопрос, как написано. – Fenikso