我在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();
}
答案 0 :(得分:0)
使用:
GThread *g_thread_new (const gchar *name,
GThreadFunc func,
gpointer data);
而不是:
guint gdk_threads_add_idle (GSourceFunc function,
gpointer data);