2012-06-17 63 views
1

我有問題: 一個線程引發從主線程偵聽的事件。在事件處理程序 主線程提出這樣 消息對話框:來自其他線程的模態MessageDialog

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

但是應用上md.Run()碰撞; (如果我使用gtk.application.invoke提高messageDialog()沒有崩潰,但也有在對話框無模式。)

+1

聽力是如何完成的? – ergosys

回答

1

GTK對象只能從主線程安全訪問。如果您從主線程訂閱事件,那並不意味着該事件將從主線程中提出。在引發它們的線程上引發事件。

你需要做的就是用Application.Invoke安全地排隊在主線程的主循環委託,並從代表訪問GUI對象。您可以在事件處理程序中執行此操作,或者甚至可以使用委託將事件分派到主線程中,以便事件處理程序不必這樣做 - 這只是您如何定義內部API的問題。

注意,雖然Application.Invoke異步運行的委託,這並不影響該對話框的方式。影響對話框模態的事情是,是否在flags參數中包含DialogFlags.Modal標誌。