Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » PyQt запрос ввода данных из отдельного потока [RSS Feed]

#1 Май 21, 2015 08:25:20

Metallikus
Зарегистрирован: 2014-11-26
Сообщения: 39
Репутация: +  1  -
Профиль   Отправить e-mail  

PyQt запрос ввода данных из отдельного потока

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

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

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

PS. Не пинайте сильно, так было написано в моём учебнике. Поток я наследую от QThread и переопределяю run()

Отредактировано Metallikus (Май 21, 2015 08:46:42)

Офлайн

#2 Май 21, 2015 13:02:35

Metallikus
Зарегистрирован: 2014-11-26
Сообщения: 39
Репутация: +  1  -
Профиль   Отправить e-mail  

PyQt запрос ввода данных из отдельного потока

Вроде бы есть какие-то мьютексы и светофоры. Пойду почитаю про них и попробую применить.

Офлайн

#3 Май 21, 2015 14:21:57

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9885
Репутация: +  853  -
Профиль   Отправить e-mail  

PyQt запрос ввода данных из отдельного потока

Metallikus
Вроде бы есть какие-то мьютексы и светофоры.
Не светофоры, а семафоры. Мьютекс - это типа такой флажок “занято”. А семафор - это как бы мьютекс с несколькими флажками “занято”.



Офлайн

#4 Май 21, 2015 15:52:03

giveback
Зарегистрирован: 2015-05-03
Сообщения: 36
Репутация: +  6  -
Профиль   Отправить e-mail  

PyQt запрос ввода данных из отдельного потока

Офлайн

#5 Май 21, 2015 18:39:12

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2757
Репутация: +  184  -
Профиль   Отправить e-mail  

PyQt запрос ввода данных из отдельного потока

#!/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_())



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Онлайн

#6 Май 22, 2015 07:20:13

Metallikus
Зарегистрирован: 2014-11-26
Сообщения: 39
Репутация: +  1  -
Профиль   Отправить e-mail  

PyQt запрос ввода данных из отдельного потока

Rodegast, спс, уж лучше я мьютексами как-нибудь Костылить паузу через while это слишком, имхо.

Офлайн

#7 Май 22, 2015 11:06:08

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2757
Репутация: +  184  -
Профиль   Отправить e-mail  

PyQt запрос ввода данных из отдельного потока

> Костылить паузу через while это слишком, имхо.
Мютексы нужны для разделения одного ресурса между потоками, но не для остановки потока. В своё время я вешеприведённым образом поток тормозил и всё нормально работало. Хотя правильнее это делать через метод wait, в общем читай документацию http://qt-doc.ru/qwaitcondition-uslovnye-ozhudaniya-v-qt.html



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Онлайн

  • Начало
  • » GUI
  • » PyQt запрос ввода данных из отдельного потока[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version