1

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

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

但是应用程序在 md.Run(); 上崩溃;(如果我使用 gtk.application.invoke() 提出 messageDialog 没有崩溃,但对话框中也没有模式。)

4

1 回答 1

1

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

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

请注意,尽管 Application.Invoke 异步运行委托,但这不会影响对话框的模式。影响对话框模式的事情是您是否在标志参数中包含 DialogFlags.Modal 标志。

于 2012-06-19T06:18:21.080 回答