如何监控 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());
这不包括任何清理。
我想监控 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());
这不包括任何清理。