Форум сайта python.su
0
Есть gui приложение при старте которого, нужно проинициализировать несколько объектов (один из объектов выполняет файловые операции, другой запрашивает данные из сети), чтобы окно программы появлялось сразу, хочу выполнять инициализацию объектов асинхронно относительно основного потока программы, который выполняет рисование окна.
Так как эти объекты предполагается использовать на всем протяжении жизни программы, нужно как-то иметь к ним доступ, чтобы можно их было в дальнейшем передавать функциям как аргументы и т д
Подскажите пожалуйста как правильно организовать асинхронную инициализацию объектов и как в дальнейшим к ним можно получить доступ?
P.S использую pyqt.
Офлайн
49
wegwgweg
Так как эти объекты предполагается использовать на всем протяжении жизни программы, нужно как-то иметь к ним доступ, чтобы можно их было в дальнейшем передавать функциям как аргументы и т д
wegwgweg
чтобы окно программы появлялось сразу, хочу выполнять инициализацию объектов асинхронно относительно основного потока программы, который выполняет рисование окна.
Офлайн
0
AlenЯ понимаю, у меня проблема в том как организовать саму логику программы. Как их лучше всего проинициализировать и вернуть обратно в программу, чтобы их можно было там использовать уже?
Для этого потоки есть, как в Python, так и в Qt.
Офлайн
49
wegwgweg
Я понимаю, у меня проблема в том как организовать саму логику программы. Как их лучше всего проинициализировать и вернуть обратно в программу, чтобы их можно было там использовать уже?
import time from PyQt4 import QtCore, QtGui class SleepProgress(QtCore.QThread): procDone = QtCore.pyqtSignal(bool) partDone = QtCore.pyqtSignal(int) def run(self): print ('proc started') for a in range(1, 1+35): self.partDone.emit(float(a)/35.0*100) print('sleep', a) time.sleep(0.2) self.procDone.emit(True) print('proc ended') class AddProgresWin(QtGui.QWidget): def __init__(self, parent=None): super(AddProgresWin, self).__init__(parent) self.thread = SleepProgress() self.nameLabel = QtGui.QLabel("0.0%") self.nameLine = QtGui.QLineEdit() self.progressbar = QtGui.QProgressBar() self.progressbar.setMinimum(1) self.progressbar.setMaximum(100) mainLayout = QtGui.QGridLayout() mainLayout.addWidget(self.progressbar, 0, 0) mainLayout.addWidget(self.nameLabel, 0, 1) self.setLayout(mainLayout) self.setWindowTitle("Processing") self.thread.partDone.connect(self.updatePBar) self.thread.procDone.connect(self.fin) self.thread.start() def updatePBar(self, val): self.progressbar.setValue(val) perct = "{0}%".format(val) self.nameLabel.setText(perct) def fin(self): sys.exit() if __name__ == '__main__': import sys app = QtGui.QApplication(sys.path) pbarwin = AddProgresWin() pbarwin.show() sys.exit(app.exec_())
Офлайн
253
AlenИ еще возникнет дополнительное состояние программы когда она полужива. И во всех местах где используются эти данные понадобятся проверки состояния.
В вашем случае будут 2 процесса генерации данных, только и всего
Офлайн
49
doza_and
И еще возникнет дополнительное состояние программы когда она полужива.
doza_and
И во всех местах где используются эти данные понадобятся проверки состояния
Офлайн
253
AlenТС нигде не пишет как он их использует. Это ваша догадка.
связать процессы получения данных и отображения этих данных
Отредактировано doza_and (Фев. 10, 2015 09:19:35)
Офлайн
49
doza_and
ТС нигде не пишет как он их использует. Это ваша догадка.
doza_and
Код программы после инициализации данных может опираться на контракт что эти данные существуют и валидны. Собственно выделение фазы инициализации для этого и нужно. Если инициализация асинхронная, то на это нельзя полагаться. Добавляется состояние программы с неинициализированными данными.
doza_and
Текстовый редактор. Вы начали выполнять асинхронно процедуру создания документа, поскольку он долго грузится с диска, когда пускаешь редактор указав имя файла в командной строке.
Что будет если во время загрузки вы нажмете Save? Ничего хорошего. Надо будет предусматривать засеривание save save_as load. Или накапливать эти команды в очереди команд в тоже самое время выполняя другие команды и это все в зависимости от состояния системы.
doza_and
Если асинхронности нет, то все эти ужимки не нужны.
Офлайн