多线程 python 应用程序未在 Visual Studio 中触发断点

kik*_*iki 6 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()
Run Code Online (Sandbox Code Playgroud)

在我的工作对象上调用的任何函数都通过信号槽连接

class Worker(QtCore.QObject):
    @QtCore.pyqtSlot()
    def get_work_done(self):
        #lets do some time consuming work.
Run Code Online (Sandbox Code Playgroud)

该代码工作正常。现在唯一的问题是,我无法调试内部发生的任何事情get_work_done。Visual Studio 不会在这些断点处中断。

当我中断任何MainWindow函数时,Visual Studio Debugger 只显示一个线程。它似乎不知道应用程序创建的任何其他线程。

小智 8

如前所述,所有不是使用 Python 创建的线程都需要向 PTVS 注册。要对 QThread 执行此操作,请在线程 run 方法中调用:

import pydevd;pydevd.settrace(suspend=False)
Run Code Online (Sandbox Code Playgroud)

这里有更多信息:Can I put BreakpointsonbackgroundthreadsinPython?


Pav*_*aev 2

调试器需要使用一些技巧来检测新线程并设置其挂钩(命中断点等所需)。它通过劫持标准 Python_thread模块来实现这一点。如果您以某种完全绕过该模块的方式创建线程(我怀疑 Qt 在这里就是这么做的),那么调试器将不会意识到这些线程。

尝试使用标准threading模块而不是QThread,看看是否有帮助。

  • 如果我使用常规线程模块,则无法使用信号和槽机制在线程之间进行通信。这就是为什么我想使用 Qt 线程。有没有办法让调试器知道这些线程? (2认同)