首页 > 解决方案 > 如何监控 Gtk3 事件循环延迟

问题描述

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

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

有什么想法吗 ?

标签: gtk3glib

解决方案


可能编写自定义GSource是您的最佳选择。

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

指定大小以允许创建从 GSource 派生的包含附加数据的结构

您还应该给它最高优先级。我不确定它是否会在每次迭代中发送,但它会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());

这不包括任何清理。


推荐阅读