Qt-Peer thread design broken

Holger Schurig hs4233 at mail.mn-solutions.de
Wed Feb 1 08:08:38 UTC 2006


I've create a VERY simply AWT app (in fact I copied it from somewhere, as I'm 
not really a Java coder)


-------------------------------------------
import java.awt.*;

public class HelloWorld extends Frame {

        private static final long serialVersionUID = 1234561155622776147L;
        public HelloWorld() {
                super("HelloWorld Title");
                setSize(200, 200);
                add(new Label("Application Template...",
                        Label.CENTER),
                        BorderLayout.CENTER);
        }

        public static void main(String[] args) {
                HelloWorld app = new HelloWorld();
                app.setVisible(true);
        }
}
-------------------------------------------

Now I start this little thingy:

-------------------------------------------
# jamvm -Dawt.toolkit=gnu.java.awt.peer.qt.QtToolkit -Dqtoptions.qws=true 
HelloWorld
QFont: It is not safe to use text and fonts outside the gui thread
QFont: It is not safe to use text and fonts outside the gui thread
QFont: It is not safe to use text and fonts outside the gui thread
QFont: It is not safe to use text and fonts outside the gui thread
QFont: It is not safe to use text and fonts outside the gui thread
QWidget::setMinimumSize: The smallest allowed size is (0,0)
QFont: It is not safe to use text and fonts outside the gui thread
QFont: It is not safe to use text and fonts outside the gui thread
-------------------------------------------

Now I could ignore this warnings, after all, my little app works. But the big 
app from gnu.classpath.examples.awt.Demo crashed several times.

So I googled for this warning and found 
http://lists.trolltech.com/qt-interest/2006-01/msg00333.html

Trolltech states on 
http://doc.trolltech.com/4.1/threads.html#threads-and-qobjects the following:

-------------------------------------------
Although QObject is reentrant, the GUI classes, notably QWidget and all its 
subclasses, are not reentrant. They can only be used from the main thread. As 
noted earlier, QCoreApplication::exec() must also be called from that thread.
-------------------------------------------

And that statement leads me to the assumption that the current design of 
qt-peer is fundamentally broken. It calls GUI classes from other threads, 
which is a No-No.




More information about the Classpath mailing list