多线程python应用程序没有在Visual Studio中遇到断点

时间:2015-04-14 19:26:56

标签: debugging visual-studio-2012 ptvs

我目前正在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调试器只显示一个线程。它似乎没有意识到应用程序创建的任何其他线程。

2 个答案:

答案 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?