2016-02-10 2 views
0

У меня проблема, поскольку я не могу найти правильное решение в ссылке, чтобы что-то произошло после gtk_main(). Это моя функция для простого бота, который решает игру, но он не будет работать, потому что он даже не начинается. Если я установил gtk_main() после завершения бота, я получу решаемую игру, чтобы она работала. Есть ли функция в gtk, которая позволяет мне работать так, как я хочу в главном цикле gtk? Вот код:GTK после основной петли

void RunBot(struct Packet *packet){ 
gtk_main(); 
while(LookForWin(packet)==0){ 
    packet->data->color_number=ColorPredictor(packet); 
    CheckColors(packet); 
    RefreshBoard(packet->essentials,board,colors,BoardButtons,Board); 
    printf("Running..\n"); 
} } 

Заранее спасибо :)

+0

Когда вы используете набор инструментов GUI, например, GTK +, вы будете использовать события, тайм-ауты и простаивающие обратные вызовы, а не писать код, который работает прямо, как в консольном приложении. Что делают 'пакет' и' LookForWin() 'делают? – andlabs

+0

@andlabs Пакет - это структура, содержащая информацию о состоянии игры и т. Д. LookForWin() - это просто проверка функции, если бот уже выиграл. Мне удалось сделать это другим путем, но я не могу заставить его обновлять каждую итерацию цикла. Вместо этого он обновляется случайно. – Darknez

ответ

0

Так в GTK у вас есть события, сигналы и тайм-ауты.

Так что, если вы хотите, чтобы вызвать функцию каждые х миллисекунд, вы должны использовать

g_timeout_add (guint interval, 
       GSourceFunc function, 
       gpointer data); 

Просто смотрите в official documentation для получения более подробной информации об этой функции.

gtk_main будет работать до тех пор, пока вы не позвоните gtk_main_quit();, но вы должны сделать это только в конце своей заявки.

1

Как отмечают andlabs и mame98, графические средства GUI ожидают, что ваша логика будет выполнена из обратных вызовов, которые выполняют небольшую работу и быстро откалибруют управление в основной цикл. Нет работы после основного цикла, потому что конец основного цикла обычно совпадает с выходом приложения.

Реорганизация существующего кода в стиле, управляемом событиями, может быть очень сложной при работе с большой базой кода устаревшего кода. К счастью, есть еще один вариант.

Вы можете запустить поток (using glib, чтобы сделать это переносимо) и запустить свою логику игры в этой теме, отдельно от потока графического интерфейса. Внутри игрового потока используйте gdk_threads_add_idle(), чтобы изредка сообщать свой графический интерфейс об изменениях. Это должно позволить как игровому коду, так и графическому интерфейсу думать, что каждый работает шоу.

Смежные вопросы