使用Gtk3,我如何在辅助线程中等待用户输入?

时间:2016-11-02 13:23:53

标签: c multithreading gtk3

我在gtk3(C语言)上遇到多线程问题。

我实施了一个转弯游戏,有一个人和几个机器人。 有一个循环(这是一个线程),机器人一个接一个地玩,直到它是人类的转弯。 然后,循环停止并等待来自人的正确输入(即来自主循环中的回调)。 但是当循环停止时,它会将主循环冻结为:不显示,也没有回调。 如果我在主循环之前没有调用自己的循环,那么主循环工作正常。

这是循环和回调。

static Player* human ;
static GCond data_cond ;
static GMutex data_mutex ;

void my_loop(Player** players, int how_many_players) {

  for(int i = 0 ; ; i++) {

    if (*(players + i) != human)
      /* a bot's turn */
    else {
      g_mutex_lock(&data_mutex) ;
      g_cond_wait(&data_cond, &data_mutex) ;
      g_mutex_unlock(&data_mutex) ;
    }
    if (i == how_many_players)
      i = 0 ;
  }
}

gboolean cb_human_input (GtkWidget *event_box,
                         GdkEvent  *event,
                         gpointer data) {
  if (right_input(event_box, event, data)) {
    do_input (event_box, event, data) ;  
    g_cond_signal(&data_cond) ;
    return TRUE ;
  }
  else
    return FALSE ;
}

以下是我在main中调用循环的方法。

int main(int argc, char* argv[]) {

  gtk_init(&argc,&argv);

  /* Initializations and signals-connecting.
     ...
  */

  // Here I run my loop ; if I don't, the main loop works fine
  gdk_threads_add_idle(my_loop, joueurs) ;

  gtk_main();
}

1 个答案:

答案 0 :(得分:0)

使用:

GThread *g_thread_new (const gchar *name,
          GThreadFunc func,
          gpointer data);

而不是:

guint gdk_threads_add_idle (GSourceFunc function,
          gpointer data);