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

Posted

技术标签:

【中文标题】gtkmm 应用程序内存使用量不断增加【英文标题】:gtkmm applications memory usage keeps increasing 【发布时间】:2013-07-09 07:21:34 【问题描述】:

我有一个客户端,它在从服务器获取数据时更新其窗口。因为它使用 ClearSilver 模板,所以每次从服务器接收更新时都需要加载 glade 文件。我试图通过每次有更新时用新生成的孩子替换 Windows 第一个孩子来做到这一点。除了内存使用量不断增加的事实之外,这很好用,并且由于客户端需要连续运行,这最终会成为一个问题。

这就是我构建窗口的方式:

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】:

您不会破坏以前的小部件。 gtkmm-tutorial:

请注意,如果您从未将小部件添加到任何父容器,或者 你做了,但后来 Gtk::Container::remove()d 从所说的父级 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);

【讨论】:

以上是关于gtkmm 应用程序内存使用量不断增加的主要内容,如果未能解决你的问题,请参考以下文章

长时间运行的 Python 程序(使用 Pandas)不断增加内存使用量

YARN 上 Spark 应用程序的物理内存使用量不断增加

iOS - UILabel(CALayer) - VMalloc 内存不断增加

适用于 iOS 的 Google Maps SDK 不断增加内存使用量

为啥 iOS AudioQueue 内存不断增加?

delphi 7 做多线程程序,内存不断增加,怎么解决?