2016-11-02 11 views
0

gtk3(C言語)でマルチスレッドに関する問題が発生しました。Gtk3では、セカンダリスレッドでユーザー入力を待つ方法はありますか?

私は1人の人間と複数のボットを持つターンバイターンゲームを実装しています。 ボットが人間のターンになるまで1つずつループするループ(スレッド)があります。 次に、ループが停止し、人間からの正しい入力(つまり、メインループ内のコールバック)を待ちます。 しかし、ループが停止すると、メインループがフリーズし、表示されず、コールバックも停止します。 メインループの前に私自身のループを呼び出さないと、メインループが正常に動作します。

ここにループとコールバックがあります。

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 ; 
} 

ここではメインでループを呼び出す方法を示します。

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(); 
} 
+0

これが答えだった場合、あなたもそのように投稿することができます。あなたがあなたの質問に対する答えまたは答えを見つけたら、自己回答が示唆されます。ようこそ! – oldtechaa

答えて

0

用途:

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

の代わり:

guint gdk_threads_add_idle (GSourceFunc function, 
      gpointer data); 
関連する問題