如何监控 Gtk3 事件循环延迟

How to monitor Gtk3 Event Loop latency

我想监控 Gtk3 事件循环延迟,即 Gtk 主事件循环每次迭代所花费的时间。基本上,这个想法是 运行 在主事件循环的每个滴答处创建一个自定义函数。

我试过 g_idle_add,但文档不清楚是否会在每个循环 调用回调

有什么想法吗?

可能写一个自定义GSource是你最好的选择。

GSource *
g_source_new (GSourceFuncs *source_funcs,
             guint struct_size);

The size is specified to allow creating structures derived from GSource that contain additional data

你也应该给它最高的优先级。 我不确定它是否会在每次迭代时分派,但每次迭代都会 prepared 。要使 source 栩栩如生,您需要使用 g_main_loop_get_context 获取上下文并调用 g_source_attach.

总而言之,它看起来像这样:

// struct MySource
// {
//  struct GSource glib;
//  int            my_data;
// };


gboolean my_prepare (GSource *source,
                     gint    *timeout_)
{
  g_message ("%li", g_get_monotonic_time());
  *timeout_ = 0;
  (MySource*)source->my_data = 1;
  return TRUE;
}


GSourceFuncs funcs = {.prepare = my_prepare};

GSource *src = g_source_new (&funcs, sizeof (MySource));
g_source_set_priority (src, G_PRIORITY_HIGH);
g_source_attach (src, g_main_loop_get_context());

这不包括任何清理。