C GTK + функция холостого хода запускается один раз - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь написать графический интерфейс и включить и выключить светодиод на Raspberry Pi 3B +. ​​

Я добавил функцию ожидания в gtk основной цикл и запустился только один раз, счетчик (szamlalo) не увеличился. Когда я пишу:

printf("\r"); //?

позади szamlalo++ все работает хорошо.

У кого-нибудь есть идеи?

мой полный код:

#include <gtk/gtk.h>
#include <glib.h>
#include "EasyPIO.h"

GtkWidget *label;
unsigned int b=0;
unsigned int szamlalo = 0;



void idle()
{
    if(szamlalo > 100)
    {
        digitalWrite(2,!digitalRead(2));
        szamlalo = 0;
        printf("led\n\r");
    }
    else
    {
        szamlalo++;
        printf("\r"); //?
    }

}

int main(int argc, char *argv[])
{
    GtkBuilder  *builder;
    GtkWidget   *window;

    gtk_init(&argc, &argv);

    builder = gtk_builder_new();
    gtk_builder_add_from_file(builder, "ui.glade", NULL);

    window = GTK_WIDGET(gtk_builder_get_object(builder, "window"));
    gtk_builder_connect_signals(builder, NULL);

    pioInit();
    pinMode(2,OUTPUT);
    g_idle_add((void*)&idle,NULL);

    label = GTK_WIDGET(gtk_builder_get_object(builder, "cimke"));

    g_object_unref(builder);
    gtk_widget_show(window);

    gtk_main();

    return 0;
}

void bezaras()
{
    printf("kilépés\r\n");
    gtk_main_quit();
}

void btn_clicked()
{
    if(b==0)
    {
        gtk_label_set_text(GTK_LABEL(label), "ügyes vagy!");
        b=1;
    }
    else
    {
        b=0;
        gtk_label_set_text(GTK_LABEL(label), "de tényleg!");
    }

}

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Сделать вашу страну volatile, как это было возможно оптимизировано компилятором

0 голосов
/ 11 января 2019

Вы вызываете неопределенное поведение:

void idle()
{
...
}

В соответствии с руководством для g_idle_add подпись функции должна быть gboolean (*GSourceFunc) (gpointer user_data);, а функция должна возвращать логическое значение.

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

Не возвращает значение, пока вызывающая сторона ожидает его и использует возвращаемое значение, неопределенное поведение.

Если вы просто вернетесь из функции, у вас может быть около 0 байт в ячейке, которая используется для возвращаемых значений, которая рассматривается как FALSE. После вызова printf вы, вероятно, получите возвращаемое значение из printf в этом месте, и когда вы печатаете 1 символ, это значение равно 1, что не FALSE, и функция вызывается снова.

У вас также есть неправильный состав:

g_idle_add((void*)&idle,NULL);

Тип void* совместим со всеми указателями данных. Вы злоупотребляете этим, чтобы вызвать неправильный тип функции в вызове. Вместо этого используйте правильную функцию и удалите актерский состав. Если вам требуется приведение типа функции, скорее всего что-то не так в использовании этой функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...