gtkmm应用程序的内存使用量不断增加

3
我有一个客户端,它在从服务器接收数据时更新其窗口。由于它使用 ClearSilver 模板,每次从服务器接收更新时都需要加载 glade 文件。我试图通过每次更新时用新生成的子窗口替换窗口的第一个子元素来实现此操作。这样做效果很好,但内存使用量会不断增加。由于客户端需要持续运行,这将最终成为一个问题。
以下是我构建窗口的方式:
Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "mywindow");
HDF* hdf = NULL;
CSPARSE *parse = NULL;
STRING newLayout;

string_init(&newLayout);
hdf_init(&hdf);
cs_init(&parse, hdf);
cs_parse_file(parse, gladeFilePath);
cs_render(parse, &newLayout, Render);
cs_destroy(&parse);

hdf_destroy(&hdf);        

Glib::RefPtr<Gtk::Builder> builder = Gtk::Builder::create();
builder->add_from_string(newLayout.buf, newLayout.len);
gtk_builder_connect_signals_full(builder->gobj(), SignalConnect, NULL);

builder->get_widget("window", window);

string_clear(&newLayout);

app->run(*window);

cs_render调用的渲染函数:
NEOERR* Render(void * ctx, char * data)
{
   STRING * layout = (STRING *)ctx;
   string_append(layout, data);

   return 0;
}

这是我重建窗口的方式:
HDF* hdf = NULL;
CSPARSE *parse = NULL;
STRING newLayout;
Gtk::Widget* widget = NULL;

string_init(&newLayout);
hdf_init(&hdf);
cs_init(&parse, hdf);
cs_parse_file(parse, gladeFilePath);
cs_render(parse, &newLayout, Render);
cs_destroy(&parse);

hdf_destroy(&hdf);

Glib::RefPtr<Gtk::Builder> builder = Gtk::Builder::create();
builder->add_from_string(newLayout.buf, newLayout.len);
gtk_builder_connect_signals_full(builder->gobj(), SignalConnect, NULL);

builder->get_widget("child1", widget);

// remove the old child
window->remove();

widget->reparent(*window);

string_clear(&newLayout);

另一个线程通过 Glib::Dispatcher 生成的新窗口
1个回答

0

不要销毁以前的小部件。 gtkmm-tutorial

请注意,如果您从未将小部件添加到任何父容器中,或者您这样做了但随后从该父容器中调用了Gtk :: Container :: remove(),则gtkmm将恢复小部件的生命周期管理到manage()调用之前的任何状态,这通常意味着删除小部件的责任返回给用户。

所以你需要像这样的内容:

Gtk::Widget* oldWidget = window->get_child(); //from Gtk::Bin
if(oldWidget) //I had errors when reparenting into an empty Gtk::Container
{
  widget->reparent(*window);
  delete oldWidget;
}
else
  window->add(*widget);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接