2012-01-12 30 views
0

在我们的项目中,我们使用的是gtkmm,我们有几个类扩展Gtk::Window以显示我们的图形界面。gtkmm-Window仍为空

我现在发现了什么调用产生的行为(在以前的版本中描述。现在的问题略有改变。)

我们显示一个窗口,就像一个魅力。

然后,我们有一个窗口显示各种状态消息。我们称之为MessageWindow。它有一个方法setMessage(Glib::ustring msg),它简单地调用标签的set_text()

经过一些处理后,我们再次隐藏这个窗口,我们现在显示一个工具栏。只是又一个简单的窗口,没什么疯狂的。

适用于所有窗口:主窗口在窗口上调用show()并创建一个新线程,该线程调用Gtk::Main::run()(不带参数)。

这就是它应该如此,直到现在。

问题从这里开始:现在主线程想要调用MessageWindow::setMessage("any string")。 a)如果我调用这个方法,消息窗口完全正确地反应。 但之后,工具栏窗口显示为空。 b)如果我不叫它,消息窗口不会改变标签(这是绝对清楚的),并且工具栏窗口显示为它应该。

看起来像窗户彼此混淆。

现在的问题:

如果我的GUI线程被阻塞Gtk::Main::run(),我怎么能现在更改标签的文本?

我们使用gtkmm-2.4(不,我们不能升级)

任何帮助表示赞赏。

回答

1

哇!这很复杂...

第一:你不应该操纵几个线程的窗口。那就是你应该只有一个GUI线程来完成所有的GUI工作,并让其他线程与它通信。

理论上可以使它工作(在Linux中;在Windows中是不可能的),但它比它的价值更麻烦。

第二:行Gtk::Main main(argc, argv)不是调用,它是一个对象声明。对象主要应该在程序期间存活,所以如果你在对象构造函数中使用它,一旦你从它返回,对象将被销毁!把它放在主要功能的顶部,忘掉它。

UPDATE:这里我常用的方法是创建一个管道,一个g_io_channel读取,并在另一端写入字节。

其他选项,虽然我没有测试它是调用让主线程的GMainContext,然后g_idle_source_new()和源附加到主背景与g_source_attach()。如果你尝试这个,它的工作原理,请在这里发布你的结果!

+0

感谢您的回复。我知道'Gtk :: Main'的生命周期。这件东西只要控制器一直存在。通常,我只从同一个线程访问GUI。但有一个例外,这似乎是造成这个问题。我正在修改我的问题 – Atmocreations 2012-01-12 15:46:27

+0

但请注意,创建Gtk :: Main的线程应该是唯一一个创建窗口并操纵它们的线程。你的问题似乎意味着你在一个线程中调用'show'并在另一个线程中调用'run'。 – rodrigo 2012-01-12 16:30:26

+0

是的。这就是我正在做的事情。似乎没有任何问题......但如何解决呢?从gui中运行所有的操作? – Atmocreations 2012-01-12 16:35:08