我有问题: 一个线程引发从主线程中侦听的事件。 eventHandler中的主线程引发 消息对话框如下:
MessageDialog md = new MessageDialog (parent_window, flags, msgtype, btntype, msg);
md.Run ();
md.Destroy();
然而,应用程序在md.Run()上崩溃; (如果我使用gtk.application.invoke()引发messageDialog,则没有崩溃,但对话框中也没有模态。)
答案 0 :(得分:1)
GTK对象只能从主线程安全访问。如果您从主线程订阅了一个事件,那并不意味着该事件将从主线程中引发。在引发它们的线程上引发事件。
您需要做的是使用Application.Invoke在主线程的主循环上安全地排队委托,并从该委托访问GUI对象。您可以在事件处理程序中执行此操作,或者您甚至可以使用委托将事件分派到主线程,以便事件处理程序不必这样做 - 这只是您要如何定义内部API的问题。
请注意,虽然Application.Invoke异步运行委托,但这不会影响对话框的形式。影响对话框模态的是你是否在flags参数中包含DialogFlags.Modal标志。