>source

주요 스크립트가 있습니다FILEA.주 프로그램을 실행하기 위해. 다른 스크립트fileb.다른 중요한 기능을 실행하는 데 사용됩니다. 나는 또한 다른 파일을 가지고있다필험,줄로 자르는... 특정 기능을 실행하는 것입니다. 이해의 용이성을 위해, 나는 고려했다FILEA.그리고fileb.오직.

여기의 워크 플로우가 있습니다FILEA.내가 실행하려고 하는가 :

from PyQt4 import QtGui
from PyQt4 import QtCore
from fileb import ClassB
class ClassA(fileb.ClassB, QtGui.QDialog, Ui_Dialog):
    """
    Main Class.
    """
    def __init__(self):
        QtGui.QDialog.__init__(self)
        self.ui= Ui_Dialog()
        self.ui.setupUi(self)
        self.ui.button1.clicked.connect(self.some_fun)
        self.progress_thread= GuiInstallProgress()
        self.progress_thread.update.connect(self.ui.progressbar.setValue)
        self.progress_thread_imager.finished.connect(self.process_finished)
    def some_fun(self):
        # do some coding
        # do some conditions
        progress= GuiInstallProgress()
        progress.start()
    def process_finished(self):
        #do some coding
        QtGui.QMessageBox.information(self, 'Finished...', 'Process finished')
class GuiInstallProgress(QtCore.QThread):
    update= QtCore.pyqtSignal(int)
    status= QtCore.pyqtSignal(str)
    finished= QtCore.pyqtSignal()
    def __init__(self):
        QtCore.QThread.__init__(self)
        self.install= ClassB()
        self.thread= GenericThread(self.install.dd_function)
    def __del__(self):
        self.wait()
    def run(self):
        self.thread.start()
        while self.thread.isRunning():
            self.update.emit(some_number_from_dd_function)  # <--Problem. Nothing is emitted.
            print some_number_from_dd_function  # <--this prints number to terminal.
            if not self.thread.isFinished() and some_number_from_dd_function== 100:
                self.status.emit("Please wait...")
        self.update.emit(100)  # <--Problem. Nothing is emitted.
        self.update.emit(0)  # <--Problem. Nothing is emitted.
        self.status.emit("")
        if self.thread.isFinished():
            self.finished.emit()  # <--Problem. Nothing is emitted.
            print "Process finished..."
        return
class GenericThread(QtCore.QThread):
    def __init__(self, function, *args, **kwargs):
        QtCore.QThread.__init__(self)
        self.function= function
        self.args= args
        self.kwargs= kwargs
    def __del__(self):
        self.wait()
    def run(self):
        self.function(*self.args, **self.kwargs)
        return
app= QtGui.QApplication(sys.argv)
window= AppGui()
ui= Ui_Dialog()
window.show()
sys.exit(app.exec_())

여기에 code 개념이 있습니다.fileb.: -

import subprocess
# other imports
class ClassB(QtGui.QDialog, Ui_Dialog):
    def __init__(self):
        QtGui.QDialog.__init__(self)
        self.ui= Ui_Dialog()
        self.ui.setupUi(self)
    def dd_function(self):
        command= ['dd', 'if=~/input.img', 'of=~/output.img', 'bs=1M']
        dd_process= subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False)
        while dd_process.poll() is None:
            time.sleep(.1)
            dd_process.send_signal(signal.SIGUSR1)
            dd_process.stderr.flush()
            while True:
                out_error= dd_process.stderr.readline()
                if out_error:
                    if 'bytes' in out_error:
                        copied= int(out_error.split(' ', 1)[0])
                        some_number_from_dd_function= round((float(copied) /float(in_file_size) * 100))
                        break
        if dd_process.poll() is not None:
            os.system("sync")

기본적으로fileb.에 사용됩니다DD.기능 및 실행중인FILEA....에 헌신적 인GuiinstallProgress.진행 상황에 따라 신호를 방출하는 데에만 사용됩니다.DD.프로그램. 그러나,DD.조작이 실행되고 있으며 진행률 표시 줄에 변경이 없습니다 (동일한 값은 터미널에 인쇄됩니다). GUI가 완전히 멈 춥니 다. UT는 신호가 방출되지 않도록 확실합니다GuiinstallProgress.프로그램이 DD 프로세스가 끝난 후 메시지 상자를 팝업하지 않으므로 DD 프로세스가 완료되면 GUI가 정상으로 돌아옵니다.

이미 사용하는 유사한 방법필험뿐만 아니라 (그러나 아닙니다DD.프로그램하지만 일부 큰 파일 복사 작업). 그것은 문제와 함께 작동합니다.

어디에서 실수를하고 있습니까? B 클래스는 인터넷에 대한 많은 문서를 통과했지만이 너트를 깰 수 없었습니다.

1. GUI를 차단하지 않고 하위 프로세스 (QProcess)를 실행하는 스레드가 필요하지 않습니다. 2. 파이프를 사용하는 경우 하위 프로세스를 잘못 사용하고 있습니다. 그렇지 않으면 교착 상태가 발생할 수 있지만 해당 파이프를 사용해야합니다. BLOCK GUI IE, SubProcess.Popen을 완전히 제거하고 범위 (50)에서 사용할 수 있습니다. 대신 동작이 동일하게 유지됩니다.

jfs2021-09-14 07:17:00

답장을 보내 주셔서 감사합니다. 1. 주요 문제는 DD 프로그램입니다. 당신은 그것의 stderr을 얻기 위해 그것을 죽여야합니다. 2. STDOUTS.POPEN 명령 줄에서 STDOUT= SUBPROCESS.PIPE를 제거했습니다. 그 결과 결과는 동일합니다. 3. 또한 QProcess를 사용하여 Stederr에서 읽을 수 없습니다.

sundar_ima2021-09-14 07:17:00

내가 말했듯이, 하위 프로세스를 제거한 경우에도 결과가 동일합니다. 완전히

jfs2021-09-14 07:17:00

작은 code 예제가 도움이 될 것입니다. 지난 1 주일 이후로 내 머리를 깨고 일하러 일어납니다.

sundar_ima2021-09-14 07:17:00

code의 TIME.SLEEP (.1)를 입력하고 일어난 일을 확인하십시오.

jfs2021-09-14 07:17:00
  • 이전 python : "django.db.utils.ProgrammingError : 관계"silk_request "는 무엇이 존재하지 않습니다. 1 :"silk_reque의 의미가 있습니까?
  • 다음 mesos : 영사에서 복구 "클러스터 리더 없음"상태