Форум сайта python.su
Нужно сделать вот какое поделие:
1) Основное окно, в которое пользователь вводит данные и жмёт кнопку типа “Запустить поток”
2) Поток, который выполняет сложные и долгие рассчёты.
3) Мелкое вредное окошко, которое должно быть вызвано потоком для запроса новых данных от пользователя. Разумеется, поток должен продолжать работу только после того, как это окошко передаст ему пользовательские данные.
Нужны ли будут новые данные (и какие именно) можно понять только во время выполнения долгих сложных вычислений, так что ввести все данные сразу в первом окошке не получится. Вычисления действительно сложные и долгие, поэтому они обязательно должны происходить в отдельном потоке, чтобы не вешать ГУЙ первого окошка.
Вопрос: как можно всё это организовать, какие есть для этого классы? Пытался с QThread разобраться, но там данные в гуй можно слать лишь через сигналы и слоты. Я могу сделать так, чтобы Первое Окошко запускало Мелкое Вредное Окошко с переданными потоком данными. Но как сделать так, чтобы поток стоял и ждал пока пользователь не введёт данные и не нажмёт кнопку типа “Продолжить выполнение потока”?
PS. Не пинайте сильно, так было написано в моём учебнике. Поток я наследую от QThread и переопределяю run()
Отредактировано Metallikus (Май 21, 2015 08:46:42)
Офлайн
Вроде бы есть какие-то мьютексы и светофоры. Пойду почитаю про них и попробую применить.
Офлайн
MetallikusНе светофоры, а семафоры. Мьютекс - это типа такой флажок “занято”. А семафор - это как бы мьютекс с несколькими флажками “занято”.
Вроде бы есть какие-то мьютексы и светофоры.
Офлайн
Офлайн
#!/usr/bin/python # coding: utf-8 import sys import PySide.QtGui as QtGui import PySide.QtCore as QtCore class potok(QtCore.QThread): def __init__(self): QtCore.QThread.__init__(self) self.data = None def run(self): self.emit(QtCore.SIGNAL("userData(PyObject)"), [1,2,3]) while not self.data: QtCore.QThread.msleep(100) print self.data class okno(QtGui.QMainWindow): def __init__(self): QtGui.QMainWindow.__init__(self) self.potok = potok() self.connect(self.potok, QtCore.SIGNAL("userData(PyObject)"), self.user_dialog) self.potok.start() def user_dialog(self): filedialog = QtGui.QFileDialog(self) filedialog.exec_() files = unicode(filedialog.selectedFiles()[0]) if files: self.potok.data = files if __name__ == "__main__": app = QtGui.QApplication(sys.argv) mainWin = okno() sys.exit(app.exec_())
Онлайн
Rodegast, спс, уж лучше я мьютексами как-нибудь Костылить паузу через while это слишком, имхо.
Офлайн
> Костылить паузу через while это слишком, имхо.
Мютексы нужны для разделения одного ресурса между потоками, но не для остановки потока. В своё время я вешеприведённым образом поток тормозил и всё нормально работало. Хотя правильнее это делать через метод wait, в общем читай документацию http://qt-doc.ru/qwaitcondition-uslovnye-ozhudaniya-v-qt.html
Онлайн