Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QML中的线程渲染器_C++_Linux_Qt_Qml - Fatal编程技术网

C++ QML中的线程渲染器

C++ QML中的线程渲染器,c++,linux,qt,qml,C++,Linux,Qt,Qml,线程化渲染器在以下代码中不工作。我在ArchLinux-3.14上使用Qt5.4和专有驱动器 ----------mytext.h----------- 说明:: 有一个类东西,它的对象是神话。类Thing的功能是提供一个可调用的函数,这里是loop。然后,此功能将持续更新m_no值并发出信号。现在的问题是,当无限循环不断更新要显示的值时,如何更新文本(名称属性)?代码对于与QML部分相关的内容是正确的,并且工作正常。不正确的是C++实现。如果删除while循环,保留其内容,并执行代码,您将看到

线程化渲染器在以下代码中不工作。我在ArchLinux-3.14上使用Qt5.4和专有驱动器

----------mytext.h-----------

说明:


有一个类
东西
,它的对象是
神话
。类
Thing
的功能是提供一个可调用的函数,这里是
loop
。然后,此功能将持续更新
m_no
值并发出信号。现在的问题是,当无限循环不断更新要显示的值时,如何更新
文本
名称
属性)?

代码对于与QML部分相关的内容是正确的,并且工作正常。不正确的是C++实现。如果删除
while
循环,保留其内容,并执行代码,您将看到文本已正确更新

应在
Qt quick render
实现中研究此类行为的原因。在某些平台上,默认情况下,渲染不是线程化的。我猜您正在Windows上工作(请参阅“Qt快速”)。因此,在非线程设置中,通过更新变量然后休眠,您将阻塞整个应用程序,从而阻止gui更新

您可以使用安排方法执行的时间间隔,或者为完全相同的目的设置QML

此外,您不需要将新值保存在temp变量中(尤其是
var
变量,在这种情况下,它会添加无用的检查)。通过在
Text
元素内设置
id
,可以直接设置Text属性。这里是重新访问的代码:

import QtQuick 2.0;

Rectangle {
    id: root
    width: 200
    height: 200

    Text {
        id: myText               // the id!
        anchors.fill: parent
        text: "dummy"            // dummy text || left empty || use "qmyTh.qm_no" (ensure a correct value is returned at creation time)
    }
    MouseArea {
        anchors.fill: parent
        onClicked: {
            qmyTh.loop()
        }
    }
    Connections {
        target:qmyTh
        onQm_noChanged: myText.text = qmyTh.qm_no    // text directly set!
    }
}
编辑

似乎使用的渲染是线程化的,因此我的推理不适用。应该还有其他问题。您可以尝试利用调试器并通过在JS处理程序中添加
console.info(…)
语句来跟踪问题。搜索问题可能有助于跟踪库中(可能)的bug

根据您必须运行的后台处理,我仍然认为使用计时器不会那么糟糕。这真的,真的取决于你想要实现什么。但是,如果您想尝试线程,Qt文档中会有很多解释(和往常一样)。 看看,,
而且是绝对的。请注意,“移动”对象(请参见链接)不能注册为上下文属性,因此必须使用其他方法之一来处理QML项目中的线程

问题是什么?解释代码?不要把堆积如山的代码扔给我们,把它减少到演示问题所需的最低限度。这段代码是怎么回事
Thing
没有声明
myLT
变量,来自
MyLText
的信号在没有
Connections
元素的情况下直接访问…请从阅读开始,特别是。之后一切都应该更清楚。很抱歉我对代码解释得不好。请检查新的qml代码和解释部分。1)我在Arch linux上使用Qt 5.4,并带有专有的AMD驱动程序“线程渲染器当前默认用于带有非Mesa驱动程序的linux”2)如果我使用计时器来计划方法执行,有信号有什么意义?它在我的影院渲染和窗口块上都很好用。如果没有你现在添加的信息,我只能猜测……所以对帮助你的人要有礼貌。给定,对于1)在任何情况下都可以尝试不带
的代码,而
;了解什么是惰性问题可能是有用的。还可以在处理程序中放置一些
console.info()
,查看如何以及何时调用它(或使用调试器…)。对于2)Jez man,信号是有用的,但我认为你想尝试C++和QML之间的连接(这不是一个测试例子吗?),使用计时器很容易达到这样的目的。如果不模拟后端线程进给QML UI,那么循环的目的是什么?如果是这样的话,使用计时器是一种快速测试C++ QML交互的方法。你明白重点了吗?你仍然可以使用信号,当然!按照您的建议使用
console.info
我用两种方法测试了代码。1) 我只是添加了
console.info
,发现渲染是线程化的;每次发出
qm\u noChanged
信号时,它都会更改
text
属性,但直到循环执行完毕,屏幕才会更新结果。因此,如果在while条件中添加
m\u no<10
,则可以看到最后的结果。我不知道为什么屏幕没有每次更新。2)我对
QThread
进行了子分类,并重新实现了
run()
函数。结果是相同的,但这一次每次更新
text
属性时屏幕都会更新。
#include "mytext.h"
#include <unistd.h>

int Thing::qm_no() {
    return m_no;
}
void Thing::loop() {
    while(true) {
        m_no += 1;
        emit qm_noChanged();
        usleep(1000000);
    }
}
#include <QQmlContext>
#include <QQuickView>
#include <QGuiApplication>
#include <QtQml>
#include "mytext.h"

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    Thing myTh;
    QQuickView view;
    view.rootContext()->setContextProperty("qmyTh",&myTh);
    view.setSource(QUrl::fromLocalFile("main.qml"));
    view.show();
    return app.exec();
}
import QtQuick 2.0;

Rectangle {
    id: root
    width: 200
    height: 200
    property var name: "test"
    Text {
        anchors.fill: parent
        text: name
    }
    MouseArea {
        anchors.fill: parent
        onClicked: {
            qmyTh.loop()
        }
    }
    Connections {
        target:qmyTh
        onQm_noChanged: {
            name = qmyTh.qm_no;
        } 
    }   
}
import QtQuick 2.0;

Rectangle {
    id: root
    width: 200
    height: 200

    Text {
        id: myText               // the id!
        anchors.fill: parent
        text: "dummy"            // dummy text || left empty || use "qmyTh.qm_no" (ensure a correct value is returned at creation time)
    }
    MouseArea {
        anchors.fill: parent
        onClicked: {
            qmyTh.loop()
        }
    }
    Connections {
        target:qmyTh
        onQm_noChanged: myText.text = qmyTh.qm_no    // text directly set!
    }
}