gtkmm-Window仍为空

时间:2012-01-12 15:16:33

标签: gtk window gtkmm

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

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

我们正在展示一个窗口,就像一个魅力。

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

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

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

到现在为止应该如何。

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

好像窗户互相搞乱。

现在的问题是:

如果我的gui-thread在Gtk::Main::run()中被阻止,我现在如何更改标签的文字?

我们正在使用gtkmm-2.4(不,我们无法升级)

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

哇!这很复杂......

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

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

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

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

其他选项,虽然我没有测试它是调用获取主线程的GMainContext然后g_idle_source_new()并使用g_source_attach()将该源附加到主上下文。如果您尝试这个并且它有效,请在此处发布您的结果!