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+ avec C & C++ Discussion :

system() contre g_spawn_async()


Sujet :

GTK+ avec C & C++

  1. #1
    Membre confirmé
    Profil pro
    Recette MOE/MOA
    Inscrit en
    Mai 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Recette MOE/MOA

    Informations forums :
    Inscription : Mai 2009
    Messages : 60
    Par défaut system() contre g_spawn_async()
    Bonjour,

    Pour mon interface en GTK+, j'ai besoin d'ouvrir différents programmes "externes". J'ai eu l'occasion de voir que system(), ce n'est pas bien.
    Seulement, le prototype de g_spawn_async() est quelque peu effarant de complexité.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    g_spawn_async
    (
        const gchar *working_directory,
        gchar **argv,
        gchar **envp,
        GSpawnFlags flags,
        GSpawnChildFunc child_setup,
        gpointer user_data,
        GPid *child_pid,
        GError **error
    )
    Auriez-vous l'amabilité de m'éclairer sur les différents paramètres avec un exemple ?

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Tu peux trouver la liste des arguments avec une description sur http://library.gnome.org/devel/glib/...#g-spawn-async Certains des arguments sont facultatifs (ie peuvent etre mis à NULL ou 0) si tu n'en as pas l'utilité

  3. #3
    Membre confirmé
    Profil pro
    Recette MOE/MOA
    Inscrit en
    Mai 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Recette MOE/MOA

    Informations forums :
    Inscription : Mai 2009
    Messages : 60
    Par défaut
    Certes oui, mais à quoi correspond "le vecteur d'arguments du processus-enfant" ?
    Quels sont les drapeaux à indiquer ? Dans quel ordre ? Que mettre comme setup quand je veux lancer feh, comme dans l'exemple suivant ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Instruction = concat(3, "feh -F -z -D 2 --filelist '", Nom_Fichier, "' &");
    Entier_Quelconque = system(Instruction);
    (concat étant une fonction de concaténation de chaînes de caractères)

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    vecteur d'argument, c'est un tableau contenant les arguments à passer à ton programme, c'est la même philosophie que le tableau passé à execv je crois. Le "child_setup", tu ne sais pas ce que c'est, donc je partirais du principe que tu n'en as pas besoin et je la mettrais à NULL.Pour les flags, idem, soit y en a qui te plaisent dans la description, soit tu les mets à 0

  5. #5
    Membre confirmé
    Profil pro
    Recette MOE/MOA
    Inscrit en
    Mai 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Recette MOE/MOA

    Informations forums :
    Inscription : Mai 2009
    Messages : 60
    Par défaut
    Les arguments, ça serait "-F -z -D 2 --filelist" ?

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Plutôt un tableau contenant "-F", "-z", ... Je sais pas s'il faut "-D", "2" ou "-D 2", je me trompe à chaque fois.

  7. #7
    Membre confirmé
    Profil pro
    Recette MOE/MOA
    Inscrit en
    Mai 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Recette MOE/MOA

    Informations forums :
    Inscription : Mai 2009
    Messages : 60
    Par défaut
    Bon, ok, une dernière question : feh, ce sera le working_directory ?

  8. #8
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Non tu peux probablement le mettre à NULL

  9. #9
    Membre confirmé
    Profil pro
    Recette MOE/MOA
    Inscrit en
    Mai 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Recette MOE/MOA

    Informations forums :
    Inscription : Mai 2009
    Messages : 60
    Par défaut
    Bon, bon, bon...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Nom_Fichier = "Diaporama.dia"
    Argv[0] = "-F";
    Argv[1] = "-z";
    Argv[2] = "-D 2";
    Argv[3] = "--filelist";
    Argv[4] = Nom_Fichier;
    g_spawn_async("/usr/bin/feh", Argv, NULL, G_SPAWN_CHILD_INHERITS_STDIN, NULL, NULL, NULL, NULL);
    ne fonctionne pas. C'est comme si la ligne n'existait pas.
    Devrais-je plutôt utiliser gdk_spawn_on_screen_with_pipes() ?

  10. #10
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Tu as effectivement mis le premier argument à NULL comme je te l'ai conseillé, c'est bien. Pour rappel, argv[0] dans un prog en C contient le nom de l'executable.

  11. #11
    Membre confirmé
    Profil pro
    Recette MOE/MOA
    Inscrit en
    Mai 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Recette MOE/MOA

    Informations forums :
    Inscription : Mai 2009
    Messages : 60
    Par défaut
    J'ai retesté avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Argv[0] = "feh";
    Argv[1] = "-F";
    Argv[2] = "-z";
    Argv[3] = "-D 2";
    Argv[4] = "--filelist";
    Argv[5] = Nom_Fichier;
    g_spawn_async("/usr/bin/", Argv, NULL, 
        G_SPAWN_CHILD_INHERITS_STDIN, NULL, NULL, NULL, NULL);
    qui ne marche pas plus.

  12. #12
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Bonjour,

    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
    char *Argv[8];
    GError *error = NULL;
     
    Argv[0] = "feh";
    Argv[1] = "-F";
    Argv[2] = "-z";
    Argv[3] = "-D";
    Argv[4] = "2";
    Argv[5] = "--filelist";
    Argv[6] = Nom_Fichier;
    Argv[7] = NULL;
    if (!g_spawn_async("/usr/bin/", Argv, NULL, 
        G_SPAWN_CHILD_INHERITS_STDIN, NULL, NULL, NULL, &error))
    {
      g_warning (error->message);
    }
    Au moins tu auras plus d'informations si ça ne fonctionne toujours pas.

    Sinon tu peux aussi utiliser g_spawn_command_line_async.

  13. #13
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Perso j'aurais tendance à commencer par lancer une appli qui ne prend pas d'argument, et une fois que ça marche, j'essaierais d'ajouter les args.

  14. #14
    Membre confirmé
    Profil pro
    Recette MOE/MOA
    Inscrit en
    Mai 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Recette MOE/MOA

    Informations forums :
    Inscription : Mai 2009
    Messages : 60
    Par défaut
    Bonjour gege2061,
    Malheureusement, pour ton code, CodeBlocks me répond "Implicit declaration of function warning".
    Pour teuf13, je n'ai, pour le moment, pas de programmes à appeler sans arguments.

    Je vais tenter g_spawn_command_line().

  15. #15
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par cypher.sephiroth Voir le message
    Malheureusement, pour ton code, CodeBlocks me répond "Implicit declaration of function warning".
    g_warning pardon, le but est juste d'afficher un message en cas d'erreur.

  16. #16
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Sur ton système, t'as probablement un bon nombre d'applis graphiques sous la main gtk-demo par exemple.

  17. #17
    Membre confirmé
    Profil pro
    Recette MOE/MOA
    Inscrit en
    Mai 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Recette MOE/MOA

    Informations forums :
    Inscription : Mai 2009
    Messages : 60
    Par défaut
    Citation Envoyé par gege2061 Voir le message
    g_warning pardon, le but est juste d'afficher un message en cas d'erreur.
    Maintenant, il me répond que "le format n'est pas une chaîne littérale et pas d'argument de format"
    Accessoirement, g_spawn_command_line_async () fonctionne.

  18. #18
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    C'est pas trop grave comme warning, mets un g_warning ("%s", error->message) pour l'éviter

  19. #19
    Membre confirmé
    Profil pro
    Recette MOE/MOA
    Inscrit en
    Mai 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Recette MOE/MOA

    Informations forums :
    Inscription : Mai 2009
    Messages : 60
    Par défaut
    Bon, ben finalement, les deux techniques marchent. Merci beaucoup.
    Une dernière question (ensuite, promis, je change de sujet) :
    Laquelle de ces deux méthodes g_spawn_async() ou g_spawn_command_line() est la plus appropriée ?

  20. #20
    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
    Par défaut
    EDIT: Ah bin j'avais pas vu la 2ème page, mais mon exemple tient tout de même la route pour la création/destruction du vecteur d'arguments

    agrv fonctionne de la même manière que dans un main traditionnel dont le prototype est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int main (int argc, char**argv)
    on voit aussi souvent avec un tableau de chaines de caractères:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int main (int argc, char*argv[])
    argc est le nombre d'arguments (arguments count), et argv un vecteur d'arguments (arguments vector).
    argv[0] contient le nom de la commande.

    Je te conseille donc de faire un truc du genre (non testé):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    GError *error = NULL;
    gchar command[] = "zenity --info --text='voici un exemple'";
    gchar **command_vector = g_strsplit (command, ' ', 0);
    if (!g_spawn_async (NULL, command_vector, NULL, 
        G_SPAWN_CHILD_INHERITS_STDIN, NULL, NULL, NULL, &error))
    {
      g_warning ("%s", error->message);
    }
     
    /* Suite de ton programme ici */
     
    /* Libère un vecteur de chaines de caractères */
    g_strfreev (command_vector);

Discussions similaires

  1. Arguments pour et contre Access ?
    Par bottura dans le forum Sondages et Débats
    Réponses: 240
    Dernier message: 23/03/2018, 23h25
  2. Protéger une disquette contre la copie
    Par benzaza dans le forum Assembleur
    Réponses: 20
    Dernier message: 16/01/2005, 10h42
  3. [VB6] [Système] Récupérer le contenu d'une fenêtre DOS
    Par Nounours666 dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 18/11/2004, 16h38
  4. Algo "Contre l'ordinateur"
    Par Black-Ghost dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 15/10/2002, 10h55
  5. [TP7]systeme d'exploitation
    Par numeror dans le forum Turbo Pascal
    Réponses: 10
    Dernier message: 15/08/2002, 08h47

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