来自其他线程的模态MessageDialog

时间:2012-06-17 16:46:47

标签: mono gtk gtk# messagedialog

我有问题: 一个线程引发从主线程中侦听的事件。 eventHandler中的主线程引发 消息对话框如下:

 MessageDialog md = new MessageDialog (parent_window, flags, msgtype, btntype, msg);
 md.Run ();
 md.Destroy();

然而,应用程序在md.Run()上崩溃; (如果我使用gtk.application.invoke()引发messageDialog,则没有崩溃,但对话框中也没有模态。)

1 个答案:

答案 0 :(得分:1)

GTK对象只能从主线程安全访问。如果您从主线程订阅了一个事件,那并不意味着该事件将从主线程中引发。在引发它们的线程上引发事件。

您需要做的是使用Application.Invoke在主线程的主循环上安全地排队委托,并从该委托访问GUI对象。您可以在事件处理程序中执行此操作,或者您甚至可以使用委托将事件分派到主线程,以便事件处理程序不必这样做 - 这只是您要如何定义内部API的问题。

请注意,虽然Application.Invoke异步运行委托,但这不会影响对话框的形式。影响对话框模态的是你是否在flags参数中包含DialogFlags.Modal标志。