方法

GLibSourceis_destroyed

从:2.12

声明 [src]

gboolean
g_source_is_destroyed (
  GSource* source
)

描述 [src]

返回值表示 source 是否已被销毁。

当您在空闲处理程序中操作对象,但可能在该空闲处理程序调度之前释放了对象时,这是很重要的。

static gboolean
idle_callback (gpointer data)
{
  SomeWidget *self = data;
   
  g_mutex_lock (&self->idle_id_mutex);
  // do stuff with self
  self->idle_id = 0;
  g_mutex_unlock (&self->idle_id_mutex);
   
  return G_SOURCE_REMOVE;
}
 
static void
some_widget_do_stuff_later (SomeWidget *self)
{
  g_mutex_lock (&self->idle_id_mutex);
  self->idle_id = g_idle_add (idle_callback, self);
  g_mutex_unlock (&self->idle_id_mutex);
}
 
static void
some_widget_init (SomeWidget *self)
{
  g_mutex_init (&self->idle_id_mutex);

  // ...
}

static void
some_widget_finalize (GObject *object)
{
  SomeWidget *self = SOME_WIDGET (object);
   
  if (self->idle_id)
    g_source_remove (self->idle_id);
   
  g_mutex_clear (&self->idle_id_mutex);

  G_OBJECT_CLASS (parent_class)->finalize (object);
}

如果由于回调中的使用后释放,在空闲处理程序触发之前销毁了小部件,则这将在多线程应用程序中失败。针对这个特定问题的解决方案是在回调中检查源是否已被销毁。

static gboolean
idle_callback (gpointer data)
{
  SomeWidget *self = data;
  
  g_mutex_lock (&self->idle_id_mutex);
  if (!g_source_is_destroyed (g_main_current_source ()))
    {
      // do stuff with self
    }
  g_mutex_unlock (&self->idle_id_mutex);
  
  return FALSE;
}

从除 GMainContext 外的线程调用此函数通常是多余的,因为源可能在返回此函数后立即被销毁。然而,一旦源被销毁,就不能再将其销毁,因此您可以从任何线程进行机会性检查。

自 2.12 起提供

返回值

类型: gboolean

TRUE 如果源已被销毁。