2016-11-27 2 views
1

Я пытался запустить команду с использованием многопроцессорности, поскольку графический интерфейс зависает при использовании цикла while. Мне нужно вызвать функцию внутри класса pyqt4. Или лучший способ справиться с мультипроцессом поможет мне Qthread? У меня есть поиск по многим учебникам, но я не могу понять, как я могу это сделать.PyQt4 как я могу использовать многопроцессорную обработку, нажав кнопку pushButton

Я пробовал, как это, что прекрасно работает. Проблема в том, что я не могу получить вход QeditText, переданный функции, если есть способ, которым я могу, тогда он будет работать для того, что я хочу сделать.

import sys 
import multiprocessing 
import time 
from PyQt4 import QtCore, QtGui 
from form import Ui_Dialog 


def worker(): 
    t = MyDialog() 
    name = multiprocessing.current_process().name 
    print name, 'Starting', t.self.ui.rtmpIN.toPlainText() 
    time.sleep(2) 
    print name, 'Exiting' 

class MyDialog(QtGui.QDialog): 
    def __init__(self, parent=None): 
     QtGui.QWidget.__init__(self, parent) 
     self.ui = Ui_Dialog() 
     self.ui.setupUi(self) 
     self.ui.startButton.clicked.connect(self.start) 
     self.ui.stopButton.clicked.connect(self.stop) 
     self.ui.comboBox.addItem("player 1") 
     self.ui.comboBox.addItem("player 2") 
     self.ui.comboBox.addItem("player 3") 
     #self.ui.comboBox.currentIndexChanged.connect(self.selectionchange) 

    def selectionchange(self,i): 
     print self.ui.comboBox.currentText() 

    def start(self): 
     worker_2 = multiprocessing.Process(target=worker) # use default name 
     worker_2.start() 
     print "in: ", self.ui.rtmpIN.toPlainText() 
     print "out: ", self.ui.outPUT.toPlainText() 
     print str(self.ui.comboBox.currentText()) 

     if self.ui.quialityBox.isChecked(): 
      q = "Streaming started" + "\n" + "quality: " + self.ui.Setquality.toPlainText() + "\n" + "player: " + str(self.ui.comboBox.currentText()) 
      self.ui.theLog.append(q) 
      #print self.ui.Setquality.toPlainText() 
     else: 
      p = "Streaming" + "\n" + "player: " + str(self.ui.comboBox.currentText()) + "\n" 
      self.ui.theLog.append(p) 

    def stop(self): 
     print 'stop pressed.' 
     self.close() 




if __name__ == "__main__": 
     app = QtGui.QApplication(sys.argv) 
     myapp = MyDialog() 
     myapp.show() 
     sys.exit(app.exec_()) 

Мне нужно уметь получать данные от этого, внутри функции работника, есть ли способ?

print "in: ", self.ui.rtmpIN.toPlainText() 
print "out: ", self.ui.outPUT.toPlainText() 

редактировать: забыл form.py здесь http://pastebin.com/HksuSjkt

+0

, пожалуйста, добавьте form.py – eyllanesc

+0

@eyllaneschere это форма http://pastebin.com/HksuSjkt – Slightz

+0

@Sligthz Я создан процесс Qthread https://github.com/CodeHuntersLab/CuriElements/blob/master/CuriElements/soundthread. py – eyllanesc

ответ

1

Это мое решение:

from PyQt4.QtCore import QThread 

class Worker(QThread): 
    def __init__(self, parent=None): 
     super(Worker, self).__init__(parent) 
     self.textin = "" 
     self.textout = "" 
     self.okay = True 

    def setTextIn(self, text): 
     self.textin = text 

    def setTextOut(self, text): 
     self.textout = text 

    def run(self): 
     while self.okay: 
      print('IN:' + self.textin) 
      print('OUT:' + self.textout) 
      time.sleep(2) 

    def stop(self): 
     self.okay = False 


class MyDialog(QtGui.QDialog): 
    def __init__(self, parent=None): 
     QtGui.QWidget.__init__(self, parent) 
     self.worker = Worker(self) 
     self.ui = Ui_Dialog() 
     self.ui.setupUi(self) 
     self.ui.rtmpIN.textChanged.connect(self.changeText) 
     self.ui.outPUT.textChanged.connect(self.changeText) 
     self.ui.startButton.clicked.connect(self.start) 
     self.ui.stopButton.clicked.connect(self.stop) 
     self.ui.comboBox.addItem("player 1") 
     self.ui.comboBox.addItem("player 2") 
     self.ui.comboBox.addItem("player 3") 

    def selectionchange(self,i): 
     print(self.ui.comboBox.currentText()) 

    def start(self): 
     self.worker.start() 
     print("in: "+self.ui.rtmpIN.toPlainText()) 
     print("out: "+self.ui.outPUT.toPlainText()) 
     print(self.ui.comboBox.currentText()) 

     if self.ui.quialityBox.isChecked(): 
      q = "Streaming started" + "\n" + "quality: " + self.ui.Setquality.toPlainText() + "\n" + "player: " + str(self.ui.comboBox.currentText()) 
      self.ui.theLog.append(q) 
     else: 
      p = "Streaming" + "\n" + "player: " + str(self.ui.comboBox.currentText()) + "\n" 
      self.ui.theLog.append(p) 

    def changeText(self): 
     self.worker.setTextIn(self.ui.rtmpIN.toPlainText()) 
     self.worker.setTextOut(self.ui.outPUT.toPlainText()) 

    def stop(self): 
     self.worker.stop() 
     self.worker.quit() 
     self.worker.wait() 
     print('stop pressed.') 
     self.close() 

    def closeEvent(self, event): 
     self.worker.stop() 
     self.worker.quit() 
     self.worker.wait() 
     QtGui.QDialog.closeEvent(self, event) 


if __name__ == "__main__": 
     app = QtGui.QApplication(sys.argv) 
     myapp = MyDialog() 
     myapp.show() 
     sys.exit(app.exec_()) 

Выход:

enter image description here

+0

i get aan error NameError: имя «QThread» не определено nvm, я добавил от PyQt4.QtCore импорта QThread , но теперь, когда я нажимаю стоп пи получить другую ошибку супер() CloseEvent (событие) TypeError:. супер() занимает по меньшей мере 1 аргумент (0 дано) – Slightz

+0

@Slightz обновить мой solution – eyllanesc

+0

@Slightz полный код: http://pastebin.com/jQ2vFc4t – eyllanesc

0

Im не эксперт по PyQt, но я предполагаю, что вы держите въездной виджет в вашем form.py eyllanesc упоминалось, и я могу видеть вас импортирован.

Одна из причин, по которой вы используете специальные переменные, чтобы содержать строку и такие из пользовательских интерфейсов, заключается в том, что класс, в котором он находится, занимает указанное пространство памяти (хорошо, когда дело касается областей и т. Д.).

Когда дело доходит до multiPROCESSING, пространство памяти больше не разделяется, и вы не можете дотянуться до этой переменной. Если вы, однако, используете multiTHREADING, это новый поток, но в том же процессе, что означает, что он может получить доступ к нужной строке Qt.

Синтаксис для этого то же самое

import threading 

def foo(): pass 

t = threading.Thread(target=foo, 
        args=[]) 

t.daemon = True 

t.start() 

Узнайте больше о потоках here

+1

Да, я попробовал модуль потоковой передачи, но могу ли я убить эту тему? Например, приложение должно перезаписать, используя FFmpeg, я подключаюсь к ssh с помощью paramiko и выполняю команду. Таким образом, иногда поток плохой, и мне нужно остановиться и отредактировать. Если я закрываю GUI каждый раз, мне придется снова настроить информацию rtmp, поэтому я хочу отключиться, когда я нажимаю кнопку «Стоп» и снова подключаюсь. – Slightz

Смежные вопросы