【问题标题】:How to set the name of a QThread in pyqt?如何在pyqt中设置QThread的名称?
【发布时间】:2012-09-21 22:30:33
【问题描述】:

我正在使用QtCore.QThread(来自PyQt4)。

要记录,我也在使用以下格式化程序:

logging.Formatter('%(levelname)-8s %(asctime)s %(threadName)-15s %(message)s')

生成的日志是:

调试 2012-10-01 03:59:31,479 Dummy-3 my_message

我的问题是我想更明确地知道哪个线程正在记录...Dummy-3 对我来说不是最明确的名称....

有没有办法将名称设置为QtCore.QThread,以便日志模块可以使用(作为 LogRecord 属性)以使日志更有意义?

谢谢!

【问题讨论】:

  • threadName 来自哪里?
  • 啊,我明白了。我认为没有一种简单的方法可以做到这一点。您不能使用您将提供的自定义标识符吗?

标签: python multithreading pyqt qthread


【解决方案1】:

如果线程模块可用,日志模块将使用threading.current_thread().name 设置threadName LogRecord 属性。

但是threading.current_threaddocs 表示如果当前线程不是由线程模块创建的,则将使用一个虚拟线程对象(因此称为“Dummy-x”名称)。

我想可以通过猴子补丁threading.current_thread 将名称重置为更合适的名称。但肯定更好的方法是在记录消息时使用extra 字典:

logging.Formatter('%(levelname)-8s %(asctime)s %(qthreadname)-15s %(message)s')
...
extras = {'qthreadname': get_qthreadname()}
logging.warning(message, extra=extras)

【讨论】:

    【解决方案2】:

    Qt5 documentation可以调用setObjectName()修改线程名

    要选择线程的名称(例如,在 Linux 上由命令 ps -L 标识),您可以在启动线程之前调用 setObjectName()。

    如果您不调用 setObjectName(),则为线程指定的名称将是您的线程对象的运行时类型的类名(例如,在 Mandelbrot 示例中为“RenderThread”,即QThread 子类的名称)。

    不幸的是,它还指出:

    这目前不适用于 Windows 上的发布版本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-25
      • 2013-12-17
      • 2018-08-11
      相关资源
      最近更新 更多