我目前正在Visual Studio中开发一个PyQt应用程序。 调试一直很好,直到我决定通过Qt线程将内容移动到工作线程来保持我的UI响应。
class MainWindow(base, form):
start_work = QtCore.pyqtSignal()
def __init__(self, parent=None):
# Create a seperate thread in which the update information is polled.
self.thread = QtCore.QThread()
# Create Worker object and move it to new thread
self.worker = Worker()
self.worker.moveToThread(self.thread)
# connect signal to start work in the extra tread
self.start_work.connect(self.worker.get_work_done)
self.thread.start()
#function emit a signal to start doing the work
def do_work(self):
self.startWork.emit()
在我的worker对象上调用的任何函数都通过信号槽连接
class Worker(QtCore.QObject):
@QtCore.pyqtSlot()
def get_work_done(self):
#lets do some time consuming work.
代码工作正常。现在唯一的问题是,我无法调试get_work_done
内发生的任何事情。 Visual Studio不会破坏这些断点。
当我在任何MainWindow
函数内部时,Visual Studio调试器只显示一个线程。它似乎没有意识到应用程序创建的任何其他线程。
答案 0 :(得分:1)
调试器需要发挥一些技巧来检测新线程并设置其挂钩(需要点击断点等)。它通过劫持标准的Python _thread
模块来实现。如果您以某种方式创建线程,完全绕过该模块,这是我怀疑Qt在这里所做的,调试器将不会知道这些线程。
尝试使用标准threading
模块而不是QThread
,看看是否有帮助。
答案 1 :(得分:0)
如上所述,所有未使用Python创建的线程都需要向PTVS注册。为此,请在线程运行方法中调用此方法:
import pydevd;pydevd.settrace(suspend=False)
此处有更多信息:Can I put break points on background threads in Python?