我有一个小程序,它使用glib。 你可以在codereview中看到它。标题是“阅读信息。什么可以做得更好?”。 我在main方法中有一个无限循环。 在这个循环中,我有一个GTree。
int main()
{
//some setup/mallocs
GTree* t = g_tree_new_full((GCompareDataFunc)g_ascii_strcasecmp,NULL,free_data,free_data);
while (1) {
//some tasks; accessing tree
}
//some free
}
在此循环内访问树。 我希望每隔x分钟(例如每15分钟)更新一次这棵树。 可能吗?我该怎么做并避免碰撞?
答案 0 :(得分:2)
不要在代码中执行while(1){...},而是使用GLib's main event loop。除了使这更容易之外,它还允许您与其他基于主循环的代码集成,例如GTK +,GIO和其他库中的异步函数。
gboolean every_15_minutes (gpointer user_data) {
/* some tasks; accessing tree */
}
int main (void) {
GMainLoop* loop = g_main_loop_new (NULL, FALSE);
/* some setup/mallocs */
GTree* t = g_tree_new_full((GCompareDataFunc)g_ascii_strcasecmp,NULL,free_data,free_data);
g_timeout_add_seconds (60 * 15, every_15_minutes, NULL);
g_main_loop_run (loop);
/* some free */
}
至于避免碰撞,您可以g_tree_lookup执行g_tree_insert以确认在g_tree_replace之前没有任何现有条目使用该密钥,或者仅执行{{3}}将丢弃该密钥如果发生碰撞,则为旧值。