这是我第一次涉足线程,所以对任何明显的错误道歉。
我有一个PyQt小部件,一个新进程 prog 在另一个线程中运行。在我的主线程中,我还将stdout
重定向到只读QTextEdit
。但是,我在引用递归时遇到错误,我担心我的线程会以一种导致print语句进入无限循环的方式相互干扰。如果我从GUI运行 prog 而不是从命令行运行,我只会遇到这些错误。我的stdout
重定向正在使用this SO answer
在伪代码中,这基本上就是我所拥有的:
gui.py
class widget(QWidget):
def __init__(self):
self.button = QPushButton("GO!", self)
self.button.clicked.connect(self.start)
def start(self):
self.thread = TaskThread()
sys.stdout = EmittingStream(textWritten = self.outputText)
self.thread.start()
def outputText(self):
#as in answer provided in link (EmittingStream in separate module)
prog.py
class TaskThread(QThread):
def run(self):
'''
Long complicated program; putting in simpler code here (e.g. loop printing to 10000) doesn't reproduce errors
'''
答案 0 :(得分:0)
我可以看到你找到了错误的位置。但是没有代码,我所知道的并不多。
满足您的方向需求,我将指向您的Python配置文件。因为看起来你需要一些python分析工具。
http://docs.python.org/2/library/profile.html
和关于这个主题的答案
答案 1 :(得分:0)
这很棘手,但我认为您的代码是线程不安全的。具体来说,查看其他stackoverflow答案(here和here),您似乎不应该从另一个线程(甚至是QThread)中访问另一个线程的Qt GUI对象。
由于您的代码中对print
的任何调用现在都访问了Qt GUI对象,因此这似乎非常不安全。
我建议安全的是:
Queue
读取时,此QThread阻止。当它从队列中获取内容时,EmmittingStream
以将内容放入Queue
,而不是直接放入Qt输出框。 答案 2 :(得分:0)
在Qt应用程序中,您必须使用一个单独的线程来处理所有gui部分。您可以使用其他线程进行计算,但不能用于用户界面。
只需在工作线程中发布有关队列中更新的消息,并使用主线程获取这些消息并更新GUI。