[Java-gnome-developer] Running File I/O Thread Crashes Java-Gnome
Brought to you by:
afcowie
From: Jester <jsn...@gm...> - 2010-06-04 20:20:17
|
I've posted this on the hackers mailing list, but since they're hackers and don't really use these bindings I will try my luck here :) Here's the code that will reproduce the crash (2 classes): --- DrawingWin (main class) import org.freedesktop.cairo.Pattern; import org.gnome.gdk.Event; import org.gnome.gdk.EventExpose; import org.gnome.gdk.Rectangle; import org.gnome.gtk.DrawingArea; import org.gnome.gtk.Gtk; import org.gnome.gtk.VBox; import org.gnome.gtk.Widget; import org.gnome.gtk.Window; import org.gnome.gtk.WindowPosition; import org.freedesktop.cairo.Context; import org.freedesktop.cairo.Format; import org.freedesktop.cairo.ImageSurface; import org.gnome.gtk.PolicyType; import org.gnome.gtk.ScrolledWindow; public class DrawingWin extends Window { private ImageSurface surface; DrawingWin() { hide(); setTitle("DrawingWin"); VBox vbox = new VBox(false, 3); final DrawingArea d; d = new DrawingArea(); d.setSizeRequest(800, 800 + 400); ScrolledWindow scroll = new ScrolledWindow(); scroll.setPolicy(PolicyType.AUTOMATIC, PolicyType.AUTOMATIC); scroll.addWithViewport(d); vbox.add(scroll); add(vbox); setPosition(WindowPosition.CENTER); setSizeRequest(600, 400); connect(new Window.DeleteEvent() { public boolean onDeleteEvent(Widget source, Event event) { Gtk.mainQuit(); return false; } }); showAll(); surface = new ImageSurface(Format.ARGB32, 800, 1200); Context im = new Context(surface); //im.setAntialias(Antialias.DEFAULT); im.setLineWidth(1.0); im.setSource(0.8, 0.8, 0.8); im.rectangle(0, 0, 800, 1200); im.fill(); im.setSource(0.0, 0.0, 0.0); im.rectangle(10, 10, 600, 400); im.stroke(); im.setSource(1.0, 1.0, 1.0); im.rectangle(10, 10, 600, 400); im.fill(); im.setSource(0.0, 0.0, 1.0); im.moveTo(25.0, 25.0); im.lineTo(50.0, 100.0); im.stroke(); d.connect(new Widget.ExposeEvent() { public boolean onExposeEvent(Widget source, EventExpose event) { System.out.println("expose action"); final Context cr; final Rectangle rect; final Pattern linear, radial; rect = event.getArea(); int canvasWidth = 800; int canvasHeight = 1400; System.out.println(rect); cr = new Context(source.getWindow()); cr.setSource(0.0, 0.8, 0.95); cr.rectangle(0, 0, canvasWidth, canvasHeight); cr.fill(); cr.setSource(surface, 0, 0); cr.paint(); System.out.println("paint"); return true; } }); } public static void main(String[] args) { Gtk.init(args); new DrawingWin(); new ThreadWin(); Gtk.main(); } } --- ThreadsWin import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.util.logging.Level; import java.util.logging.Logger; import org.gnome.gdk.Event; import org.gnome.gtk.Button; import org.gnome.gtk.VBox; import org.gnome.gtk.Widget; import org.gnome.gtk.Window; import org.gnome.gtk.WindowPosition; public class ThreadWin extends Window { DownloadTask t; ThreadWin() { hide(); setTitle("ThreadWin"); VBox vbox = new VBox(false, 3); Button start = new Button("Start"); start.connect(new Button.Clicked() { @Override public void onClicked(Button source) { t = new DownloadTask(); t.start(); } }); vbox.add(start); add(vbox); setPosition(WindowPosition.CENTER); setSizeRequest(140, 40); connect(new Window.DeleteEvent() { public boolean onDeleteEvent(Widget source, Event event) { t.cancelTask(); return false; } }); showAll(); } private class DownloadTask extends Thread implements Runnable { boolean canceled = false; @Override public void run() { int idx = 0; while (!canceled) { System.out.println(idx); //loadDataFromFile("PWAV.q"); File f = new File(System.getProperty("user.home")); File[] files = f.listFiles(); for (int i = 0; i < files.length; i++) { f = files[i]; if (f.isFile()) { readFile(f); } } synchronized (this) { try { wait(10); } catch (InterruptedException ex) { Logger.getLogger(DrawingWin.class.getName()).log(Level.SEVERE, null, ex); } } idx++; } } void cancelTask() { canceled = true; } } void readFile(File f) { try { FileInputStream fin = new FileInputStream(f); BufferedReader in = new BufferedReader(new InputStreamReader(fin)); // do nothing here... in.close(); } catch (FileNotFoundException ex) { System.out.println(ex); } catch (IOException ex) { System.err.println(ex); } } } --- Instructions: 1. Run DrawingWin which will open two windows, DrawingWin and ThreadsWin 2. Press start which launches a thread 3. You will notice that DrawingWin goes blank (the drawing disappears) 4. Close ThreadWin by pressing the close button on the window bar 5. Close DrawingWin 6. You will see the following crash log: Exception in thread "main" org.gnome.glib.FatalError: Gdk-CRITICAL gdk_window_get_position: assertion `GDK_IS_WINDOW (window)' failed at org.gnome.gtk.GtkMain.gtk_main(Native Method) at org.gnome.gtk.GtkMain.main(GtkMain.java:82) at org.gnome.gtk.Gtk.main(Gtk.java:119) at DrawingWin.main(DrawingWin.java:119) My apologies for the slightly complicated example, but it requires two windows to trigger the assertion problem from above. Jester |