GTK: g_timeout_add () Raspberry Pi - PullRequest
       10

GTK: g_timeout_add () Raspberry Pi

0 голосов
/ 13 сентября 2018

Следующий код прекрасно работает почти на платформах Linux, которые я тестировал (Ubuntu, Mint, Raspbian x86), но полностью не работает на Raspbian для Raspberry Pi.

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

Может ли быть тайм-аут на 5 мс, который не может выдержать малиновый пи?Почему происходит сбой только одного аспекта, в то время как все другие аспекты не показывают глюков и т. Д. Это так, как если бы тайм-аут по тем или иным причинам был отменен.

void control_init() {

...

  g_timeout_add(20, control_quick_timer_event, NULL);

...

}



void control_quick_timer_event() {

  control_read_values();

  control_since_last++;

  if (control_since_last == 2) {

    while (serialDataAvail(control_serial)) {

      serialGetchar(control_serial);

    }

    control_read_state = -1;
  }
}

* Редактировать *Дополнительный из printf ("\ n");«исправляет» проблему по неизвестной причине, но я не могу принять ее как решение, поскольку мне нужно распечатать серийный номер без миллионов пробелов.

return True; / return 1;в хвосте также приводит к той же ошибке, это не влияет на результат.

Ответы [ 2 ]

0 голосов
/ 15 сентября 2018

Точно так же, как @ pan-mroku пытается вам сказать, вам нужен этот код:

bool control_quick_timer_event() {

  control_read_values();

  control_since_last++;

  if (control_since_last == 2) {

    while (serialDataAvail(control_serial)) {

      serialGetchar(control_serial);

    }

    control_read_state = -1;
  }
return True;
}

Если вы не return True, время ожидания будет отменено.

0 голосов
/ 13 сентября 2018

Я подозреваю, что это потому, что ваш обработчик возвращает void.Начиная с g_timeout_add :

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

#include <gtk/gtk.h>

gboolean control_quick_timer_event(gpointer data)
{
    printf("I'm still alive\n");
    return TRUE;
}

int main (int argc, char *argv[])
{
    gtk_init (&argc, &argv);
    g_timeout_add(20, control_quick_timer_event, NULL);
    gtk_main ();
    return 0;
}
...