How Start a Qthread from qml?

浪子不回头ぞ 提交于 2019-12-31 02:56:31

问题


I need to Start immediately and stop then a QThread extended class from Qml File. Is there any solution for that? here is my class :

class SerialManager : public QThread
{
    Q_OBJECT
public:
    CircularList<unsigned char> buffer_[2];

signals:
    void dataReady(short *value,int len,unsigned short sample);

protected:
    void run();
};

回答1:


if you have SerialManager like this:

class SerialManager : public QThread
{
    Q_OBJECT
public:
    CircularList<unsigned char> buffer_[2];

signals:
    void dataReady(short *value,int len,unsigned short sample);

protected:
    void run();
};

in main.cpp add bellow code:

qmlRegisterType<SerialManager>("Device",1,0,"Serial");

then in your qml do this:

 Component.onCompleted: {
            thread.start()
        }
 Component.onDestruction:
    {
        thread.quit()

    }



回答2:


Yes, you can expose an instance to QML using setContextProperty (read this document) and then call any method you want by marking it with Q_INVOKABLE. As start() and quit() are slots you don't even need to define those yourself. Something like this should work:

class MyThread : public QThread
{
    Q_OBJECT
public:
    MyThread() : m_quit(false) {}

    Q_INVOKABLE void quit() {
        m_quit = true;
    }

protected:
    void run() {
        while (!m_quit)
            qDebug("Looping...");
    }

private:
    volatile bool m_quit;
};

when starting:

MyThread t;
QQuickView view;
[...]
view.engine()->rootContext()->setContextProperty("thread", &t);

In your QML:

thread.start()

or

thread.quit()



回答3:


As an alternative solution, more QML oriented, you can export a class of utilities to do your job from C++ to QML, then use a WorkerScript (see here the documentation) to spawn a new thread and execute a bunch of JavaScript code that deal with that class.

WorkerScript are meant so that you can:

Use WorkerScript to run operations in a new thread. This is useful for running operations in the background so that the main GUI thread is not blocked.

It would be cleaner and you'd avoid to deal with an annoying start method from within QML.



来源:https://stackoverflow.com/questions/35548120/how-start-a-qthread-from-qml

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!