Будут ли вызываться обратные вызовы времени ожидания GTK + в строгом порядке? - PullRequest
3 голосов
/ 06 февраля 2010

Когда я добавляю много разных таймаутов (с каждым intervall==0) в поток, который является , а не основным потоком (где находится gtk_main()) ...

g_timeout_add(0, func, NULL);

... будут ли тогда другие func() обратные вызовы происходить в том же порядке Я назвал соответствующие g_timeout_add() 's?


Я спрашиваю, потому что GTK # использует внутренние таймауты для реализации Application.Invoke() (см. Application.cs и Timeout.cs ).


РЕДАКТИРОВАТЬ: Соответствующие файлы glib являются

Ответы [ 2 ]

4 голосов
/ 10 февраля 2010

Внутренне, g_timeout_add вызывает g_hook_insert_sorted .Если используется g_timeout_add_full, приоритет определяет порядок, в противном случае ловушка добавляется в конец списка.Хуки выполняются по порядку, поэтому, когда используется только g_timeout_add, ответ - да.

К сожалению, нет явной гарантии, и для меня это выглядит как деталь реализации, которая может измениться в будущем.

0 голосов
/ 26 января 2012

Как насчет обеспечения порядка вызовов, сохраняя ваши обратные вызовы явно в списке, а затем используя одну функцию g_timeout_add () для вызова функции, которая выполняет итерацию по этому списку?

static gboolean
call_in_order (GList* callbacks)
{
  for (; callbacks != NULL; callbacks = callbacks->next)
    {
      g_assert (callbacks->data != NULL);
      GSourceFunc callback = (GSourceFunc)(callbacks->data);

      callback(NULL);
    }
}


...

 GList *callbacks = NULL;
 callbacks = g_list_append(callbacks, func1);
 callbacks = g_list_append(callbacks, func2);
 callbacks = g_list_append(callbacks, func3);
 callbacks = g_list_append(callbacks, func4);

 g_timeout_add(0, (GSourceFunc)call_in_order, callbacks);
...