[Interest] Guide me through the Qt offerings for GUIs
Roland Hughes
roland at logikalsolutions.com
Sun Apr 18 14:50:39 CEST 2021
On 4/18/21 5:00 AM, Rui Oliveira wrote:
> If you want to talk about "like" QQC... Do electron apps count? I do use
> VSCode a lot. But I guess those are a league of their own.
No, Electron doesn't count. Electron is what replaces Qt in many many
former Qt environments. There are a lot of text editors and other
desktop apps written under Electron.
https://atom.io/
Actually quite a few text editors taking either Electron or pure
JavaScript approach, assuming Wikipedia could be trusted
https://en.wikipedia.org/wiki/Comparison_of_JavaScript-based_source_code_editors
> I've also been monitoring:
> https://bugreports.qt.io/browse/QTBUG-78634
> https://bugreports.qt.io/browse/QTBUG-74407
Well, client of mine that using a commercial license that tipped the
scales north of $600K emailed me off-list to rag about this decade old bug.
https://bugreports.qt.io/browse/QTBUG-12055
They lost half a staff day on this. Not one person lost half a day, the
project team. I think they have north of twenty people on the project
still. You can't have a medical device with random crashes so when one
turns up, it's all hands on deck.
See this line -
https://code.qt.io/cgit/qt/qtbase.git/tree/src/corelib/serialization/qtextstream_p.h#n72
<https://code.qt.io/cgit/qt/qtbase.git/tree/src/corelib/serialization/qtextstream_p.h#n72>
=====
Issue is that it doesn't properly unregister the signal from QFile when
you tell it to, so you think it would be done with it but nope, signal
fires when QFile is closed and now you have a race if you continue to
use that QFile object. You can see in the code they _thought_ they
were, but actually they were removing all connections to QTextStream
private class signals... Of which there are none. Probably works "fine"
if you are largely single threaded, but not for multiple threads. As
pointed out in that report, a mutex should have been ok for
synchronization, save for this bug.
=====
The fix has been known for a long time. Almost as long as the bug has
been in the database.
> I guess QML is more present in embedded? Or maybe some entreprise stuff
> we don't know about...
Just phones and John Deere. I haven't spoken with anyone working on Ford
projects in a while but last I heard QML was on its way out there too.
QML was a bad idea trying to get around a legacy problem without
actually fixing the legacy problem. The legacy problem is the single
thread-i-ness of Qt. Back when Intel was selling 486 chips with a
manufacturing defect as SX
https://en.wikipedia.org/wiki/Intel_80486SX
We didn't have high end graphics. We were lucky to have 33Mhz and
threading libraries were not robust. Many would only yield the single
core when an I/O operation happened. That thread calculating Pi to 2000
decimal places locked up your machine. Keep in mind that an 80 MEG hard
drive was just massive. Corporate desktops still tended to have 20 MEG
drives and managers who didn't really need it had 40 MEG. Most people
pull down stupid cat videos larger than that today. You need to
understand that so you understand just how little I/O was really
happening. There was nothing you could cobble together in the little
computer world to store a Terabyte. You couldn't even really get to a
Gig on a network of shared drives.
Single thread-i-ness design decisions weren't horrible then.
* You can only paint in the main event loop
* Data models used by Widgets have to exist in the main event loop
* Not everything is tested across threads (see above bug)
These short sighted decisions weren't unique to Qt. Poke around in
Google books for PC Magazine and other programming magazine articles of
the day and you will find things written about the 1,000 line switch
statements that were the center of most every Windows program. Zinc and
every other GUI library had a similar problem. Zinc didn't even have a
hook in their event loop so you could give time to things like serial
communications or other devices. You had to roll your own event loop to
do that.
The world of JavaScript has done a lot of work solving "You can only
paint in the main event loop".
https://stackoverflow.com/questions/36942555/does-the-electron-framework-allow-multi-threading-through-web-workers
https://mozillagfx.wordpress.com/2017/12/05/off-main-thread-painting/
I haven't kept up on the whole "worker" thing JavaScript and browsers
have going on. I just know that is why you see themes and syntax
highlighting in things like VSCodium, Atom, etc. that look great and are
really fast. If you try to do them in the C++/Qt world you pay a heavy
coding price or you watch machines grind to a halt when you open a 5000
line source file. That's one bad trait that made it over to CopperSpice too.
The dude coding FeatherPad seems to be slowly learning the reality as well.
https://github.com/tsujan/FeatherPad
"Refactored the code of syntax highlighting 15 days ago "
The QPlainTextEdit and use of regular expressions all having to run in
the main event loop to implement syntax highlighting, brace matching,
etc. duth take a toll. Signals out from other threads to tell the Widget
to paint something tend to not work well either.
It's been a while since I looked at the KATE code base to see how they
are handling syntax highlighting.
https://github.com/KDE/kate/tree/master/kate
The developers of Juffed punted and used Scintilla_qt. You will find
many many editors using one of the Scintilla libraries under the hood
because they mostly solved this problem. I think they even solved the
problem of only highlighting the visible lines plus a few on either side
as well. This dramatically improves performance because you are only
highlighting 80-100 lines instead of all 10,000 when you load a huge
source file.
All of this is why I'm so excited to read about the Vulkan stuff going
on with the CsPaint library and the Vulkan links I sent you earlier. On
the surface it seems like someone talked to people who write software on
big computers before work started. Need to dig deeper to be really
certain, but you communicate with a "loader" that can support many revs
of the API.
Hopefully they did it under the hood like big computers.
Small API to negotiate common API version.
Identify a series of shared memory regions used for communication.
Your program builds things per the agreed upon API version in the
shared/accessible region then swats the loader with a "load that" command.
If they did that, we can paint from anywhere. Instead of low level
manipulation of the screen(s) the screens become a service. Applications
just communicate with the service.
--
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
More information about the Interest
mailing list