Найти - Пользователи
Полная версия: PyQt запрос ввода данных из отдельного потока
Начало » GUI » PyQt запрос ввода данных из отдельного потока
1
Metallikus
Нужно сделать вот какое поделие:
1) Основное окно, в которое пользователь вводит данные и жмёт кнопку типа “Запустить поток”
2) Поток, который выполняет сложные и долгие рассчёты.
3) Мелкое вредное окошко, которое должно быть вызвано потоком для запроса новых данных от пользователя. Разумеется, поток должен продолжать работу только после того, как это окошко передаст ему пользовательские данные.

Нужны ли будут новые данные (и какие именно) можно понять только во время выполнения долгих сложных вычислений, так что ввести все данные сразу в первом окошке не получится. Вычисления действительно сложные и долгие, поэтому они обязательно должны происходить в отдельном потоке, чтобы не вешать ГУЙ первого окошка.

Вопрос: как можно всё это организовать, какие есть для этого классы? Пытался с QThread разобраться, но там данные в гуй можно слать лишь через сигналы и слоты. Я могу сделать так, чтобы Первое Окошко запускало Мелкое Вредное Окошко с переданными потоком данными. Но как сделать так, чтобы поток стоял и ждал пока пользователь не введёт данные и не нажмёт кнопку типа “Продолжить выполнение потока”?

PS. Не пинайте сильно, так было написано в моём учебнике. Поток я наследую от QThread и переопределяю run()
Metallikus
Вроде бы есть какие-то мьютексы и светофоры. Пойду почитаю про них и попробую применить.
py.user.next
Metallikus
Вроде бы есть какие-то мьютексы и светофоры.
Не светофоры, а семафоры. Мьютекс - это типа такой флажок “занято”. А семафор - это как бы мьютекс с несколькими флажками “занято”.
giveback
https://pypi.python.org/pypi/async_gui/0.1.1
Rodegast
#!/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_())
Metallikus
Rodegast, спс, уж лучше я мьютексами как-нибудь Костылить паузу через while это слишком, имхо.
Rodegast
> Костылить паузу через while это слишком, имхо.
Мютексы нужны для разделения одного ресурса между потоками, но не для остановки потока. В своё время я вешеприведённым образом поток тормозил и всё нормально работало. Хотя правильнее это делать через метод wait, в общем читай документацию http://qt-doc.ru/qwaitcondition-uslovnye-ozhudaniya-v-qt.html
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB