이 Q QCoreApplication 문제가 발생했습니다. QObject가 QThread 내에서 실행을 마친 후에 input()을 호출하면 "QCoreApplication :: exec : 이벤트 루프가 이미 실행 중입니다"라는 콘솔에 무한 루프가 인쇄됩니다.input()이 "QCoreApplication :: exec : 이벤트 루프가 이미 실행 중"인 이유는 무엇입니까?
코드에서 일반 작업자를 QObject로 생성하고이를 QThread (하위 클래스로 만드는 대신 QThread를 사용하는 보편적 인 방법)로 이동 한 다음 일반 작업자 내에서 다른 QObject (마스터 클래스) 함수를 실행합니다. 마스터가 실행 된 후에 input()을 호출하지 않는 한 모든 것이 잘 작동합니다. 마스터 인스턴스의 함수가 아닌 작업자에서 직접 함수를 실행하는 경우에도 문제가 발생합니다.
import sys
from PyQt4.QtCore import QCoreApplication, QObject, QThread, pyqtSignal, pyqtSlot
class Worker(QObject):
"""
Generic worker.
"""
start = pyqtSignal(str)
finished = pyqtSignal()
def __init__(self, function):
QObject.__init__(self)
self._function = function
self.start.connect(self.run)
def run(self):
self._function()
self.finished.emit()
class Master(QObject):
"""
An object that will use the worker class.
"""
finished = pyqtSignal()
def __init__(self):
QObject.__init__(self)
@pyqtSlot()
def do(self):
print("Do what?")
self.finished.emit()
def done():
# FIXME This will cause an infinite loop printing to the console:
# "QCoreApplication::exec: The event loop is already running"
input("Enter your answer: ")
def main():
app = QCoreApplication(sys.argv)
master = Master()
worker = Worker(master.do)
master.finished.connect(done)
thread = QThread()
thread.started.connect(worker.run)
worker.moveToThread(thread)
# Terminating thread gracefully, or so.
worker.finished.connect(thread.quit)
worker.finished.connect(worker.deleteLater)
thread.finished.connect(thread.deleteLater)
thread.start()
sys.exit(app.exec_())
if __name__ == "__main__":
main()
우수! 나는 당신의 대답으로 2 가지 문제를 해결했습니다. 고마워. – R01k