es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

C – GTK3 – hilos

He escrito un programa en C utilizando GTK3 versión 3.24 en una Raspberry Pi. Hay varios botones en la aplicación.

Cuando hago clic en un botón en particular, quiero lanzar un hilo que pueda producir una serie de pulsos en un pin de la Raspberry Pi. Será posible detener la generación de pulsos haciendo clic en otro botón en cualquier momento. Utilizo pigpio para controlar el pin. Por lo tanto, tengo una función de botón llamada ‘on_execute_clicked’ para lanzar un pthread, pero la compilación falla con el mensaje:

/usr/bin/ld: main.o: referencia indefinida a símbolo ‘pthread_create@@GLIBC_2.4’

Tengo la declaración #include <pthread.h> en mi archivo fuente.

¿Qué estoy haciendo mal?

¿No es posible utilizar pthread en un programa GTK3?

¿Cómo puedo hacer que una “función” se ejecute en segundo plano?

Saludos,
Jorgen

PD: el g_thread no está disponible en GTK3 versión 3.24.</pthread.h>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error indica que el enlazador no puede encontrar la biblioteca pthread durante el proceso de compilación. Para solucionar esto, debes enlazar la biblioteca pthread al compilar tu programa. Puedes hacer esto agregando la siguiente opción a tu comando de compilación:

    -lpthread
    

    Por ejemplo, si estás usando gcc, puedes compilar tu programa con el siguiente comando:

    gcc programa.c -o programa `pkg-config --cflags --libs gtk+-3.0` -lpthread
    

    Esto enlazará la biblioteca GTK3 junto con la biblioteca pthread.

    Usar pthreads en un programa GTK3 es definitivamente posible y es una práctica común. Te permite ejecutar tareas de larga duración en segundo plano sin congelar la interfaz gráfica.

    Para ejecutar una función en segundo plano, puedes crear un nuevo pthread utilizando la función pthread_create. Por ejemplo, puedes definir una nueva función para generar pulsos en un pin y luego llamar a esta función desde un pthread:

    void *generar_pulsos(void *arg) {
        // código para generar pulsos en un pin
    }
    
    void on_ejecutar_clicked() {
        pthread_t hilo;
        pthread_create(&hilo, NULL, generar_pulsos, NULL);
    }
    

    Esto creará un nuevo pthread que ejecutará la función generar_pulsos. Puedes detener la generación de pulsos estableciendo una bandera en tu código que la función generar_pulsos verifique periódicamente. Cuando se haga clic en el botón de detener, puedes establecer la bandera para detener la generación de pulsos.

    Ten en cuenta que es posible que necesites utilizar mutex o otros mecanismos de sincronización si accedes a recursos compartidos desde múltiples hilos.

Comments are closed.