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();
}
これが答えだった場合、あなたもそのように投稿することができます。あなたがあなたの質問に対する答えまたは答えを見つけたら、自己回答が示唆されます。ようこそ! – oldtechaa