[Interest] QML and Threads

Konstantin Tokarev annulen at yandex.ru
Wed Oct 21 17:42:12 CEST 2015



21.10.2015, 17:15, "Nuno Santos" <nunosantos at imaginando.pt>:
> I think neither QSharedMemory or WorkerScript will fit in this case.
>
> Let me try to explain it better. Lets suppose I have the following basic model class
>
> class Model {
> QML_PROPERTY ListOfTypeA
>>
> QList<TypeA*> _listOfTypeA
> }
>
> where
>
> class TypeA {
> QML_PROPERTY ListOfTypeB
>>
> QList<TypeB*> _listOfTypeB
> }
>
> class TypeB {
> properties
>> }
>
> The UI represents this model and interaction with it can changes the model, adding/removing instances of TypeA, adding/removing instances of TypeB, modifying properties inside of TypeB objects, etc. Everything regarding the model is written in C++
>
> As I see it, I would need a Model that could be plugged to Qml in order to display its properties, and at the same time, having a thread iterating thru that model doing things.
>
> The problem I always end up is that I cannot plug the Qml to that model if that model is running on a different thread.
>
> When I think in making the glue between a model that is attached to QML and another model that is running on a different thread, I cannot find a simple way of doing it.
>
> Sorry, I have some difficulty in describing this problem in english.
>
> Is there any will know pattern for this problem? Maybe the solution is accomplished with your suggestions but i’m still in the dark.

You can make pointer to your model accessible from code of your Qml-facing classes, then read and modify it from both threads. Don't forget to add mutexes to prevent races

>
> Regards,
>
> Nuno Santos
> Founder / CEO / CTO
> www.imaginando.pt
> +351 91 621 69 62
>
>> On 21 Oct 2015, at 14:57, Jérôme Godbout <jerome at bodycad.com> wrote:
>>
>> You were probably aware of that but just in case, you may want to take a look at Worker Script:
>> http://doc.qt.io/qt-5/qml-workerscript.html
>>
>> or other Qt multi threading:
>> http://doc.qt.io/qt-5/threads-technologies.html
>>
>> We made a parallel QQmlEngine with it's own Qml objects tree and cloning or moving object between them. I don't recommend it, it was painful regarding Qml singleton (from qmldir singleton are not created by engine, C++ one on the other hand can be created properly) and some others minor things. Performance wise you need a lot of processing to be worth it. But Worker Script may be what you are looking for, sadly only basic type can be exchange between the working scripts.
>>
>> On Wed, Oct 21, 2015 at 9:01 AM, Konstantin Tokarev <annulen at yandex.ru> wrote:
>>> 21.10.2015, 13:28, "Nuno Santos" <nunosantos at imaginando.pt>:
>>>> Hi,
>>>>
>>>> I have been building a complex UI based on a data model that didn’t required threading. All the things could happen in the UI thread.
>>>>
>>>> Now I’m adding to that model a functionality that works under time critical events that can’t be compromised by UI interactions. This is specially true on mobile devices where the computing power is not abundant.
>>>>
>>>> As far as I know and from my testings, I can't expose to QML objects that are on a different than the GUI.
>>>>
>>>> Before advancing to a major refactor where all the time sensitive parts are running on a different thread and asynchronously updating it’s state to the UI thread, I would like to have your opinion about it.
>>>>
>>>> Is this my only option? Keep a clone model of my data on a different thread and respond to it’s updates on the UI thread?
>>>
>>> You may want to use shared memory to avoid cloning of data.
>>>
>>> --
>>> Regards,
>>> Konstantin
>>> _______________________________________________
>>> Interest mailing list
>>> Interest at qt-project.org
>>> http://lists.qt-project.org/mailman/listinfo/interest


-- 
Regards,
Konstantin



More information about the Interest mailing list