IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GTK+ Discussion :

Comment utiliser GTK et libcurl en même temps ?


Sujet :

GTK+

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Novembre 2018
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2018
    Messages : 31
    Points : 10
    Points
    10
    Par défaut Comment utiliser GTK et libcurl en même temps ?
    Bonjour,

    J'essaye d'utiliser GTK et l'API libcurl dans un programme C en même temps, mais il y a un problème.

    J'ai remarqué que lorsque je faisais ma requête curl (curl_easy_perform) après gtk_init, la requête se passe mal et me renvoie la moitié des données.

    En revanche, lorsque je fais une requête avant gtk_init, tout se passe bien.

    Voici ma question, y'a-t-il un moyen qui permet d'utiliser curl et GTK en même temps et de faire des requêtes après gtk_init ?

    Je pense que ma solution se trouve dans le multi-threading mais je ne comprends pas comment cela fonctionne.

    Merci.

  2. #2
    Membre éclairé Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Points : 717
    Points
    717
    Par défaut
    Bonjour,
    dans la bibliothèque libcurl tu as un exemple pour utiliser libcurl et gtk en même temps :

    https://curl.haxx.se/libcurl/c/curlgtk.html
    For crying out loud !

  3. #3
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Points : 2 002
    Points
    2 002
    Par défaut
    Bonjour,

    sans montrer de code, ça va être difficile de répondre.

    Je vois des exemples d'utilisation des deux ensemble, donc c'est possible:
    https://curl.haxx.se/libcurl/c/curlgtk.html
    https://curl.haxx.se/libcurl/c/smooth-gtk-thread.html

    En revanche, ces exemples sont très vieux, et certaines des fonctions, comme g_thread_init et gdk_threads_enter sont obsolètes. Il faut juste savoir que GTK+ n'est pas thread-safe (comme tous les toolkits graphiques, à ma connaissance). L'approche moderne est donc de ne faire les appels graphiques qu'à partir de du thread principal, en appelant g_idle_add dans ton thread. La callback passée en paramètre sera alors appelée à partir du thread principal, celui utilisé par GTK+.
    Documentation officielle GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels par l'exemple (platform-demos):
    GTK (tous langages)

  4. #4
    Membre à l'essai
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Novembre 2018
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2018
    Messages : 31
    Points : 10
    Points
    10
    Par défaut
    Merci pour vos réponses.

    J'avais déjà regardé les exemples de codes avec curl et gtk mais ceux-ci sont obsolètes effectivement.

    J'ai essayé en appelant ma fonction qui fait la requête cURL (getData) dans une fonction avec gdk_threads_add_idle mais cela n'a rien changé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gdk_threads_add_idle(getData, search->url);
    J'ai aussi essayé d'utiliser un pthread comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int ret = 0;
    pthread_t pp;
    ret = pthread_create(&pp, NULL, getData, search->url);
    if(!ret){ printf("SUCCEED\n"); }
    Le succeed est bien affiché, donc le thread est bien créé mais cela ne change rien non plus, ma requête curl se passe mal.

    Je vous montre ma fonction pour la requête curl dans le cas où j'utilise gdk_threads :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    int getData(gpointer user_data)
    {
        CURL * curl;
        char * url = user_data;
        CURLcode res;
        char *errorString = NULL;
        String s;
        struct curl_slist * headers = NULL;
        curl = curl_easy_init();
     
        if(curl)
        {
            initString(&s);
     
            headers = curl_slist_append(headers, "Accept: application/json");
            headers = curl_slist_append(headers, "Content-Type: application/json");
            headers = curl_slist_append(headers, "charsets: utf-8");
     
            //curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
            curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
            curl_easy_setopt(curl, CURLOPT_URL, url);
     
            curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, FALSE);
            curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, FALSE);
            curl_easy_setopt(curl, CURLOPT_SSLVERSION, 6);
     
            curl_easy_setopt(curl, CURLOPT_USERAGENT, "libcurl-agent/1.0");
            curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
            //write data in a string
            curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeFunc);
            curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s);
     
            res = curl_easy_perform(curl);
            cJSON *json = cJSON_Parse(s.ptr);
            errorString = cJSON_Print(json);
            free(s.ptr);
        }
        if(errorString == NULL)
        {
            printf("FAILLLLLLL");
        } else {
           printf("DATA : %s\n",errorString);
        }
        printf("url : %s\n", url);
        if(res != CURLE_OK)
          fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
     
        curl_easy_cleanup(curl);
     
        return FALSE;
    }
    Je viens de me rendre compte de l'erreur plus précisemment, enfait il y a une erreur lors du parsing d'un nombre décimal tel que 46.8999 par exemple. J'utilise cJSON, sauriez-vous comment faire à part cJSON_Parse ?

    Merci.

  5. #5
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Points : 2 002
    Points
    2 002
    Par défaut
    Là on sort un peu du sujet GTK+ si c'est un problème de parsing... Mieux vaudrait poster dans le forum C.
    Documentation officielle GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels par l'exemple (platform-demos):
    GTK (tous langages)

  6. #6
    Membre à l'essai
    Homme Profil pro
    Ingénieur informatique
    Inscrit en
    Novembre 2018
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2018
    Messages : 31
    Points : 10
    Points
    10
    Par défaut
    J'ai trouvé mon erreur, il s'agissait sans doute d'une confusion entre les séparateurs de nombres décimaux anglais et français ('.' et ',').

    Utiliser gtk_disable_setlocale avant gtk_init a résolu mon problème.

    Merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 17/10/2012, 12h38
  2. Réponses: 4
    Dernier message: 07/04/2007, 02h05
  3. [C#][Mysql]Comment utiliser plusieurs dataset sur la même connexion
    Par Invité dans le forum Accès aux données
    Réponses: 3
    Dernier message: 05/12/2006, 10h30
  4. Comment utiliser Gtk::Expander .
    Par man in the hill dans le forum GTK+ avec C & C++
    Réponses: 4
    Dernier message: 06/10/2006, 19h40
  5. m3g : utilisation de plusieurs objets en même temps
    Par chabfive dans le forum Développement Mobile en Java
    Réponses: 1
    Dernier message: 23/06/2006, 15h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo