[Interest] QML Singleton and QTimer?

Jérôme Godbout godboutj at amotus.ca
Fri May 7 16:46:59 CEST 2021


Hi,
Is your QTimer access before the QGuiApplication is created (static singleton)? That could explain why this complain and moving the singleton instance into the GuiApplcation constructor solve your problems.

What we do over here, I have a custom template method that register the singleton from Qml and from C++ singleton class (templated too). This keep a map of type and pointer to object:

typedef QMap<QQmlEngine*, QMap<QString, QPointer<QObject>>> SingletonMapType;
extern SingletonMapType singleton_instances_map_;

after that the C++ singleton fetch into that map and so does my Qml singleton register type, so I get a single instance no matter who the C++ or the Qml request the singleton first. It might not be ideal, but it work well. So they are not really a static instance but instead a version that is kept based on the current QQmlEngine and application. If your application only use a single QQmlengine (like most of them do, you can skip the first layer of the map and simply use the map from string to QObject. For the QString you can extract it from template type and T::staticMetaObject.className()

you only need a getSingleton<T>() and a createSingleton<T>() class to fill the blank. So my class are not bake with singleton, there might be an instance that is singleton instead (make it easier to test the class without enforcing singleton into it and I can still make memento and the like of those object without being screw to have only hard single copy.


Jérôme Godbout, B. Ing.

Software / Firmware Team Lead
O: (418) 682-3636 ext.: 114
C: (581) 777-0050
godboutj at dimonoff.com<mailto:godboutj at dimonoff.com>
[signature_757333330]<https://www.dimonoff.com/>
dimonoff.com<https://www.dimonoff.com/>
1015 Avenue Wilfrid-Pelletier,
Québec, QC G1W 0C4, 4e étage


From: Jason H <jhihn at gmx.com>
Date: Friday, May 7, 2021 at 10:10 AM
To: Jérôme Godbout <godboutj at amotus.ca>
Cc: interestqt-project.org <interest at qt-project.org>
Subject: Re: [Interest] QML Singleton and QTimer?
Well, the documentation gives the example of the singleton being instantiated at the main.cpp:main() level.

It felt a little wrong, but I subclassed QGuiApplication, and created and registered the singleton there:

GuiApplication::GuiApplication(int argc, char*argv[]):

        QGuiApplication::QGuiApplication(argc, argv)

{

        m_hardwareInterface = new HardwareInterface;

        qmlRegisterSingletonInstance("com.company", 1, 0, "HardwareInterface", m_hardwareInterface);

}

This seems to work, but seemed unnatural.






Sent: Thursday, May 06, 2021 at 5:42 PM
From: "Jérôme Godbout" <godboutj at amotus.ca>
To: "Jason H" <jhihn at gmx.com>, "interestqt-project.org" <interest at qt-project.org>
Subject: Re: [Interest] QML Singleton and QTimer?
You can check the thread affinity of an object and the current thread that will display the problem you encounter. Use a queued signal into the QTimer thread to sent the start (it will be delayed until the thread process the event, hopefully you do no need precision there).

Jérôme Godbout, B. Ing.

Software / Firmware Team Lead
O: (418) 682-3636 ext.: 114
C: (581) 777-0050
godboutj at dimonoff.com<mailto:godboutj at dimonoff.com>
[signature_93124102]<https://www.dimonoff.com/>
dimonoff.com<https://www.dimonoff.com/>
1015 Avenue Wilfrid-Pelletier,
Québec, QC G1W 0C4, 4e étage


From: Interest <interest-bounces at qt-project.org> on behalf of Jason H <jhihn at gmx.com>
Date: Thursday, May 6, 2021 at 5:34 PM
To: interestqt-project.org <interest at qt-project.org>
Subject: [Interest] QML Singleton and QTimer?
I'm trying to have a simple singleton class, but it doesn't appear that I can use timers?


HardwareInterface::HardwareInterface(QObject *parent) : QObject(parent)
{
        m_timer = new QTimer(this);

        connect(m_timer, &QTimer::timeout, this, [=](){
                qDebug() << Q_FUNC_INFO;
        });

        m_timer->start(100); // QObject::startTimer: Timers can only be used with threads started with QThread

}

main.cpp: int main() {
...
qmlRegisterSingletonInstance("com.company.example", 1, 0, "HardwareInterface", &hardwareInterface);
...

How do we go about using timers in singletons?

_______________________________________________
Interest mailing list
Interest at qt-project.org
https://lists.qt-project.org/listinfo/interest
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20210507/044bc5c5/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: image001.png
Type: image/png
Size: 13927 bytes
Desc: image001.png
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20210507/044bc5c5/attachment-0002.png>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: image002.png
Type: image/png
Size: 13928 bytes
Desc: image002.png
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20210507/044bc5c5/attachment-0003.png>


More information about the Interest mailing list