[Gtk-sharp-list] Example code: Thread.Init() breaks single core machine
aaron at hardwarehookups.com.au
Tue Apr 10 11:16:35 EDT 2007
Can I please get some feedback on whether the following code locks up
on your non-AMDX2 Windows machines? The code simulates a situation
where the first thing you want to do is show a dialog over the main
window, e.g. because some config file failed to load. The code works
great on my AMD X2 natively. Under VMWare (which IME behaves like
single core or Intel dual core system) the code breaks. And guess
what... if I remove the Thread.Init() magic the situation reverses. Hooray! :-D
public class Test
private Label label = null;
private int counter = 0;
private bool configurationFailed = false;
private Gtk.Window wnd;
// Want to display a dialog, but can't.
public static void Main()
if (!GLib.Thread.Supported) GLib.Thread.Init();
Test t = new Test();
// After constructing main window.
// Start the timer.
GLib.Timeout.Add(100, new GLib.TimeoutHandler(t.Tick));
// After starting the timer.
// After the magic call.
wnd = new Gtk.Window("Test");
wnd.Destroyed += new EventHandler(wnd_Destroyed);
// Ladida, Gtk# is cool...
VBox vbox = new VBox();
label = new Label(counter.ToString());
vbox.PackStart(label, false, false, 0);
// and then for some reason...
configurationFailed = true;
void wnd_Destroyed(object sender, EventArgs e)
private bool Tick()
// During a timer
//showMessage("new settings for VioLet Composer.");
configurationFailed = false;
label.Text = "" + counter;
private void showMessage(string p)
Gtk.Dialog dlg = new Dialog("caption", wnd, DialogFlags.Modal);
dlg.DefaultResponse = Gtk.ResponseType.Ok;
ScrolledWindow sw = new ScrolledWindow();
Label l = new Label(p);
l.Wrap = true;
Because of the whole Application.Run() thing, there's no way to hook
when your main window *actually* opens, only when it's shown. I spent
a lot of time tonight thinking my problem was just that I was
Run()ning the modal dialog before the Application was Run().
Apparently that isn't a problem.
But then, you'd expect timer callbacks don't start until things are
Run(), right...? Wrong! I've just wasted the second half of the
evening trying to work out the order of operations of Gtk# startup
only to discover Gtk# itself really doesn't seem to care, except
where this threading stuff is concerned. After finding out that I
could start a timer and then not Run() the Application before the
first timeout, I realised it was just another one of those things
that someone writing single threaded C++ doesn't think about.
So how does one safely open a dialog (ok, maybe just without crashing
to start with) as a result of something that happened before the main
window was opened? I can't possibly be the first person in the world
to be doing this, so I'm going to start by assuming I've done
something wrong again, but I will be looking at Gtk# with much more
closely this time. ;-)
[Sigh] So this is why Linux users are always talking about porting -
they have so much time in between actually being able to do it. :-D
Aaron Oxford - aaron+hardwarehookups .com .au
Director, Innovative Computer Solutions (Aust) Pty. Ltd.
49 Maitland Rd, Mayfield, NSW 2304 Australia
Developer, SourceForge project VioLet Composer
More information about the Gtk-sharp-list