[Interest] Running Qt in a shared library on a Mac

Till Oliver Knoll till.oliver.knoll at gmail.com
Thu Jan 23 10:11:45 CET 2014


Am 23.01.2014 um 03:15 schrieb Eric Feigenson <eric at feigenson.net>:

>> ....  I know that on the Mac, all GUI things need to happen in the main thread,

AKA "GUI thread". We'll come to that in a moment...


>> so that the QApplication would have to run in the main thread.  But if I do a QApplication.exec() on the main thread, then the main thread will block until all the Qt goodness has completed.
> 
> Right now I'm using a dylib, but a static link would be just as good if it would help.

First off, whether your code to be run is located in a shared lib or everything is statically linked together into a single executable does not matter for the problem at hand.

(There are other implications when statically compiling the Qt libs, but they relate to the "Qt plugin system")

> The forum posting shows some attempts at using QThreads to solve the problem, but at the moment they don't, and I'm at a loss.

I don't know what that code looks like, but when it sais that "all painting needs to be done in the main thread" what is really meant is that "all painting needs to be done in the same thread where the (underlying) "painting system" has been initialised".

That initialisation happens when instantiating QApplication. Since for an ordinary Qt that typically happens in the function main() that thread is usually called "main thread".

However "GUI thread" is a more correct term, since - AFAIK - the instance of QApplication does not necessarily have to "live" in the "main thread": you should be able to instantiate a new thread and instantiate QApplication in that thread. If you restrict all your (Qt) painting to that same thread everything should be fine. Hence "painting in the /GUI/ thread only" is a better description (but again: in most Qt cases main = GUI thread).

By the way, all the above is true for all Qt supported platforms, because the underlying graphics systems might not like to be called from different threads - Cocoa is indeed one of them.


Cheers,
  Oliver

P.S. The tricky part is probably to make sure that QApplication is really only instantiated in the context of the new "GUI thread". Also refer to ongoing discussion on this mailing list about QThread and QObject::moveToThread or google for "you are all doing it wrong qthread" (or not ;))
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20140123/a86c9ce5/attachment.html>


More information about the Interest mailing list