【问题标题】:gtkmm-Window remains emptygtkmm-窗口仍然为空
【发布时间】:2012-01-12 15:16:32
【问题描述】:

在我们的项目中,我们使用gtkmm,并且我们有几个扩展Gtk::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(不,我们无法升级)

感谢任何帮助。

【问题讨论】:

    标签: gtk window gtkmm


    【解决方案1】:

    哇!好复杂……

    首先:您不应该从多个线程操作窗口。也就是说,您应该只有一个 GUI 线程来完成所有 GUI 工作,并让其他线程与之通信。

    理论上可以让它工作(在 Linux 中;在 Windows 中是不可能的),但麻烦多于值得。

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

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

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

    【讨论】:

    • 感谢您的回复。我知道Gtk::Main 的生命周期。只要控制器存在,这个东西就会存在。通常,我只从同一个线程访问 GUI。但是有一个例外,这似乎是导致问题的原因。我正在修改我的问题
    • 但请注意创建 Gtk::Main 的线程应该是唯一创建窗口并操作它们的线程。您的问题似乎暗示您在一个线程中调用 show 并在另一个线程中调用 run
    • 是的。这就是我正在做的事情。似乎工作没有任何问题......否则如何解决?直接从 gui 运行所有操作?
    • 好的。我现在改变了这一点。但是如何在后台运行某些东西时使用 GTK 更新 GUI?我们在这个后台进程中有回调,需要通过这些回调在 gui 中发布状态消息。在 Java 中,有类似 invokeLater() 的东西。
    • 谢谢你的好点。我以不同的方式解决了它 - 并且按照 gtkmm-developers 的意图。我首先将要设置为消息的字符串推送到 SafeQueue (我的 std::queue 实现线程安全的包装器),然后使用 Glib::Dispatcher 发送通知,告知其中有新内容。像魅力一样工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多