GTK + - Как прослушать событие из метода? - PullRequest
1 голос
/ 11 декабря 2011

Я пишу приложение, которое запускает алгоритм, но позволяет вам «пройтись» по алгоритму, нажав кнопку - отображая, что происходит на каждом шаге.

Как мне прослушивать события внутри метода? например, посмотрите на код, который я получил.

static int proceed; 

button1Event(GtkWidget *widget)
{
    proceed = 0;

    int i = 0; 
    for (i=0; i<15; i++)  //this is our example 'algorithm'
    {

                    while (proceed ==0) continue; 

        printf("the nunmber is %d\n", i);
        proceed = 0; 

    }


}

button2Event(GtkWidget *widget)
{
    proceed = 1; 

}

Это не работает, потому что требуется выйти из метода button1, прежде чем он сможет прослушивать button2 (или любые другие события).

Я думаю, что-то вроде этого в то время как цикл.

 while(proceed == 0)
 {
    listen_for_button_click(); 
 }

Что это за метод?

Ответы [ 3 ]

3 голосов
/ 12 декабря 2011

«Настоящий» ответ здесь (тот, который вам даст любой опытный программист на GTK +), возможно, вам не понравится: не делайте этого, ваш код структурирован неправильно.

Опции включают в себя:

  • рекомендуется: реструктурировать приложение, чтобы оно было ориентировано на события; возможно, вам нужно отслеживать свое состояние (конечный автомат или просто логический флаг) и игнорировать любую кнопку, которая в данный момент не применяется.
  • вы можете запустить рекурсивный основной цикл, как в другом ответе с помощью gtk_main_iteration (); однако это довольно опасно, потому что в этом цикле может произойти любое событие пользовательского интерфейса, такое как закрытие окон или другие совершенно не связанные вещи. Не работает в большинстве реальных приложений любого размера.
  • переместить логику блокировки в другой поток и обмениваться данными через GAsyncQueue или что-то в этом духе (осторожно, это трудно сделать правильно и, вероятно, будет излишним).

Я думаю, вы ошибаетесь:

 while(proceed == 0)
 {
    listen_for_button_click(); 
 }

Вы не хотите, пока циклы такие; Вы просто хотите, чтобы основной цикл GTK + делал вашу блокировку. Когда вы получите нажатие кнопки в обратном вызове, затем напишите любой код после этого цикла while.

1 голос
/ 11 декабря 2011

Вы можете проверять наличие ожидающих событий и обрабатывать события в цикле while в щелкаемом обратном вызове.Что-то в этих строках:

button1Event(GtkWidget *widget)
{
    proceed = 0;

    int i = 0; 
    for (i=0; i<15; i++)  //this is our example 'algorithm'
    {

       while (proceed ==0)
       {
           /* Check for all pending events */
           while(gtk_events_pending())
           {
                gtk_main_iteration(); /* Handle the events */    
           }
           continue; 
       }

        printf("the nunmber is %d\n", i);
        proceed = 0; 

    }

}

Таким образом, когда связанный с событиями щелчок второй кнопки добавляется в очередь событий, которую нужно обработать, проверка будет видеть события как ожидающие и обрабатывать их, а затем продолжить.Таким образом, ваши глобальные изменения стоимости могут быть отражены, и шаг должен быть возможен.
Надеюсь, это поможет!

0 голосов
/ 11 декабря 2011

Если вы хотите сделать это таким образом, единственный способ, который мне приходит в голову, - это создать отдельный поток для вашего алгоритма и использовать некоторые методы синхронизации для уведомления этого потока из обработчиков щелчков кнопок.

GTK + (точнее, glib) имеет собственный API для потоков и синхронизации.Насколько я знаю Переменные условия являются стандартным способом реализации логики ожидания-уведомления.

...