在我们的项目中,我们使用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
(不,我们无法升级)
感谢任何帮助。
答案 0 :(得分:1)
哇!这很复杂......
首先:你不应该操纵几个线程的窗口。那就是你应该只有一个GUI线程来完成所有的GUI工作,让其他线程与它进行通信。
理论上可以使它工作(在Linux中;在Windows中是不可能的)但是它比它的价值更麻烦。
第二:行Gtk::Main main(argc, argv)
不是一个调用,它是一个对象声明。对象main应该在程序的持续时间内存在,所以如果你在对象构造函数中使用它,一旦从它返回,对象就会被销毁!只需将它放在主要功能的顶部就可以忘掉它了。
UPDATE :我通常的方法是创建一个管道,一个g_io_channel来读取,并在另一端写入字节。
其他选项,虽然我没有测试它是调用获取主线程的GMainContext
然后g_idle_source_new()
并使用g_source_attach()
将该源附加到主上下文。如果您尝试这个并且它有效,请在此处发布您的结果!