On 2/3/23 05:00, Stefan Seefeld wrote:
Hello,

I haven't got any response to my question, but as the answer may really
help us simplify our code I'm sending it again.
Thanks for any help !

On Tue, Nov 22, 2022 at 9:02 AM Stefan Seefeld <ste...@seefeld.name> wrote:

Hello,
we are using Qt State Machines in a number of places in our applications
to manage object states for certain types of objects. Occasionally I would
like to use and manipulate such objects in a non-event-driven context, i.e.
without a running event loop.
Short of a StateMachine function that allows me to wait for outstanding
transitions to be completed, I wrote a little helper function that
instantiates a `QEventLoop`, then calls
`processEvents(QEventLoop::ExcludeUserInputEvents)` to drain the event
queue and thus make sure that all in-flight transitions have been completed.
While this appears to be working fine, I'm not sure this is the best way
(or at the very least, a particularly elegant way) to achieve what I want.

Is the above a "correct" way to get what I want ? Is there a better way ?

Stefan,

You aren't getting responses because you have run headlong into the single-threadiness of Qt. During the days of OS/2 and the 486/SX this single-threadiness didn't matter. We had one CPU. We could kind of predict how things would run. The Qt architecture became "everything in the main event loop and that loop runs only in the primary thread."

Despite the cries of impurity against it, QDialog has its own event loop because that is how life works. Tasks interrupt you that must be completed prior to anything else moving forward.

You probably need to purge Qt from your design tools. Without knowing more I cannot say for certain. I can tell you of the sacrilege (in the eyes of the Qt dev team) you are going to be forced into due to this architectural flaw.

Solution 1: the qApp pointer

Because the architecture of Qt doesn't work in real life, there has been since the earliest days the qApp pointer.

https://doc.qt.io/qt-6/qapplication.html#qApp

Under the hood it is QCoreApplication::instance(). That gets you access to the main event loop so you can qApp->processEvents(); The vast majority of database applications have to resort to this. Too many bits and pieces seem to queue events rather than just processing so for big I/O one gets forced into this despite all of the clucking of tongues from the Qt purists.

Solution 2: No Qt.

The C++ standard has moved forward and made copy-on-write illegal since C++11. If you want to read a "discussion" about it here:

https://stackoverflow.com/questions/12199710/legality-of-cow-stdstring-implementation-in-c11

Here are some good discussions on rolling your own pure C++ state machine classes.

Barr group
https://barrgroup.com/embedded-systems/how-to/coding-state-machines

https://www.codeproject.com/Articles/1087619/State-Machine-Design-in-Cplusplus-2

https://www.aleksandrhovhannisyan.com/blog/implementing-a-finite-state-machine-in-cpp/

In particular, you should also look at the set_callback() methods found in this NanoGUI demo program.

https://github.com/mitsuba-renderer/nanogui/blob/master/src/example1.cpp

As stated earlier, the C++ standard has moved forward in a manner that is away from "the Qt way." Your classes can now have std::function elements which may or may not be set. If you don't have multiple subscribers you don't need signals & slots.

The roll-your-own implementation gets you out of "the main event loop" so you can do what you wish when you wish in any thread you wish. Where you will be hamstrung by Qt again (assuming you need it) is screen updates. Painting can only occur in the main event loop which only exists in the main thread.

Hope this helps. At least I responded when everyone else turned a deaf ear.

--
Roland Hughes, President
Logikal Solutions
(630)-205-1593

http://www.theminimumyouneedtoknow.com
http://www.infiniteexposure.net
http://www.johnsmith-book.com
http://www.logikalblog.com
http://www.interestingauthors.com/blog

_______________________________________________
Interest mailing list
Interest@qt-project.org
https://lists.qt-project.org/listinfo/interest

Reply via email to