Qt中的快速发射信号会导致一个segfau

2024-09-29 19:21:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用PyQt5和QML(qt5.7.1)构建一个应用程序,它控制许多硬件,并且遇到了一个问题,即一个接一个地发射10+信号导致应用程序出现故障。我附上了一个MWE来演示这个问题。在

MWE创建一个后台线程,然后使用信号每毫秒更新主线程中的两个标签。这个例子在windows7和linux中都是随机的,但一般在一秒钟之内。我在linux中安装了Qt调试符号,发现它在QV4中的随机位置进行分段,尽管每个分段错误的调用似乎都与内存管理器有关。在

{每次调用之间都发出一个错误的信号。在

这是我第一次使用Qt/QML,所以如果这不是使用信号的正确方法,我很抱歉,但我找不到任何东西表明不要这样使用它们。在

在起始页.qml在

import QtQuick 2.7
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.0

ApplicationWindow {
    visible: true
    id: mainWindow

    ColumnLayout {
        Label {
            id: runLabel
            property int timesRun: 0

            text: "Number of times run: " + timesRun

            Connections {
                target: worker

                onDoSomethingDone: {
                    runLabel.timesRun = runLabel.timesRun + 1;
                }
            }
        }

        Label {
            id: dataLabel
            property real value: 0.0

            text: "Data: " + value

            Connections {
                target: worker

                onDataChanged: {
                    dataLabel.value = data
                }
            }
        }
    }
}

螺纹_测试.py在

^{pr2}$

Tags: importid应用程序信号valuelinux错误qt
1条回答
网友
1楼 · 发布于 2024-09-29 19:21:51

QML不能直接访问另一个线程,因此如果您将一个项连接到另一个线程中的对象,则会导致类似您所观察到的问题。如果要访问另一个线程,则必须从Python端执行此操作,即:

Worker(another thread)  > Proxy(main Thread)  > QML

在您的情况下,解决方案是:

^{pr2}$

相关问题 更多 >

    热门问题