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 :

Fermer une fenêtre avant une commande systeme


Sujet :

GTK+

  1. #1
    Membre confirmé Avatar de acryline
    Profil pro
    Inscrit en
    Août 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 200
    Par défaut Fermer une fenêtre avant une commande systeme
    Bonjour,

    J'ai codé un petit programme pour télécharger des fichiers avec un pseudo et un mot de passe depuis un ou plusieurs URL ou un fichier txt contenant des URL. Mon système d'exploitation est Ubuntu Hardy.J'ai utilisé la bibliothèque GTK+ mais pour la commande de téléchargement j'ai utilisé la fonction system() qui envoit un code avec wget.
    A ce niveau le programme fonctionne.

    J'ai voulu ajouter une option pour que l'utilisateur puisse choisir le répertoire de téléchargement. Pour cela j'utilise la fonction gtk_file_chooser_dialog_new. Que j'ai placée avant ma commande systeme.
    Mais quand je clique sur le bouton "ouvrir" de la fenêtre de sélection du répertoire, cette fenêtre ne se ferme pas avant que le fichier soit entièrement téléchargé.
    J'imagine que la fonction système est prioritaire sur les fonction de GTK. J'aimerais que cette fenêtre se ferme avant le téléchargement.

    C'est un problème auquel je suis confrontée pour la première fois.. je savais que ça existait mais jusqu'à présent ça ne me concernait pas . Je vais sans doute encore avoir besoin de contrôler les priorités d'exécution de mes commandes.

    En effet, plus tard j'aimerais utiliser une barre de progression pour visualiser l'avancé du téléchargement. J'arrive à trouver la taille du fichier à télécharger et la taille du fichier télécharger à un temps x. Il me reste à pouvoir trouver cette taille toutes les secondes par exemple.

    Auriez-vous une solution simple à mon problème de gestion de priorité des tâches (je demande sans doute beaucoup) ,sinon un tuto à lire... une piste, un mot (timer )? Que me conseillez-vous ?
    Merci pour votre aide.

  2. #2
    Membre confirmé Avatar de acryline
    Profil pro
    Inscrit en
    Août 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 200
    Par défaut
    Auriez-vous même une toute petite piste de recherche, un tuto simple sur le sujet, ou peut être une option pour ma commande système à utiliser SVP.
    Le problème c'est que je ne sais pas quoi chercher .... J'ai cherché timer pile interruption... mais il y a tellement de sujet et c'est souvent écrit pour des pro, je n'y arrive pas c'est trop vaste.

    Et si vous n'avez pas compris mon explication pourriez vous aussi me le dire...

  3. #3
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Sans voir le code concerné ca va être dure de répondre à coup sûr mais il me semble qu'un simple gtk_widget_destroy(); de la fenêtre de dialogue pour choisir le répertoire de téléchargement avant l'appel à system(); devrait suffire pour la fermer.

    Quant à connaître l'état d'avancement du téléchargement la réponse à cette question se trouve dans la gestion des pipes. Ce qui implique la non utilisation de la fonction system(). Aie! ca se complique .

    Le principe est le suivant. Il faut pouvoir récupérer dans ton programme la sortie console de la commande wget qui elle t'affiche le taux de chargement. Pour faire ca regarde la fonction suivante. Elle te permet de lancer une fonction et d'y connecter 2 pipes entrée/sortie qui permettent d'envoyer et de recevoir la sortie console de la commande lancée.

  4. #4
    Membre confirmé Avatar de acryline
    Profil pro
    Inscrit en
    Août 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 200
    Par défaut
    Merci pour la réponse.
    Voilà ce que je fais dans mon code :
    . j'ouvre une fenêtre pour choisir le répertoire
    - quand le dossier est choisi j'utilise gtk_widget_destroy(); pour détruire la fenêtre
    - ensuite je crée la chaîne qui contient le code et je l'utilise dans la fonction system().

    Mais malheureusement la fenêtre se ferme seulement quand le fichier est téléchargé, même si je mets gtk_widget_destroy() avant systeme().

    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
    ...
      if (test==TRUE)
            {
                                //Choisir le dossier d'enregistrement
                                 selectionRepertoire(p_gadget); // fonction ci-dessous
    
                                 //construire le code systeme
    
                                for(j=0;j<p_gadget->ligne;j++)
                                {
                                 strcpy(code,"wget --output-file=");
                                 strcat(code,p_gadget->nomFichier);
                                 strcat(code,"/info.txt" );
                                 strcat (code," --directory-prefix=");
                                 strcat(code,p_gadget->nomFichier);
                                 strcat(code,"/ --http-user=");
                                 strcat(code,login);
                                 strcat(code," --http-password=");
                                 strcat(code,password);
                                 strcat(code," ");
                                 strcat(code,p_gadget->url[j]);
                                 //télécharger
                                i=system(code);
                                }
                 }
    ...
    Fonction selection Repertoire :
    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
     
    void selectionRepertoire(GADGET *p_gadget)
    {
     
       GtkWidget *selection;
       gint reponse;
     
       selection=gtk_file_chooser_dialog_new(g_locale_to_utf8( "Sélectionnez un fichier", -1,
                                                                           NULL, NULL, NULL),
                                                GTK_WINDOW(p_gadget->fenetre[0]),
                                                GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
                                                GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
                                                GTK_STOCK_OPEN, GTK_RESPONSE_OK,
                                                NULL);
        gtk_widget_show(selection);
        //On interdit l'utilisation des autres fenetres.
        gtk_window_set_modal(GTK_WINDOW(selection), TRUE);
     
     
        reponse=gtk_dialog_run ( GTK_DIALOG ( selection ));
        switch ( reponse )
         {
             case GTK_RESPONSE_OK :
             p_gadget->nomFichier =gtk_file_chooser_get_filename ( GTK_FILE_CHOOSER ( selection ));
             gtk_widget_destroy ( GTK_WIDGET (selection ) );
             break;
     
             case GTK_RESPONSE_CANCEL:
             gtk_widget_destroy ( GTK_WIDGET (selection ) );
             break;
     
             default:
             gtk_widget_destroy ( GTK_WIDGET (selection ) );
             break;
         }
        gtk_widget_show_all(p_gadget->fenetre[0]);
        }

  5. #5
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Tout d'abord deux petites choses:
    1. Tu "castes" selection alors qu'il est déjà déclaré comme un GtkWidget. Donc inutile. Un gtk_widget_destroy(selection); suffit amplement.
    2. L'utilisation de g_local_to_utf8(); n'est pas très appropriée. Configure simplement l'éditeur de texte que tu utilises pour écrire ton code de manière à ce qu'il sauve en UTF8. Ca t'évitera l'utilisation de cette fonction et en plus des pertes mémoires (cette fonction alloue dans le tas !)

    Pour ton problème essaie d'ajouter juste après le gtk_widget_destroy(); cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while (gtk_events_pending ())
        gtk_main_iteration ();
    Cette boucle attend que toutes les demandes graphiques de ton interface soient éxécutées avant de poursuivre.

  6. #6
    Membre confirmé Avatar de acryline
    Profil pro
    Inscrit en
    Août 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 200
    Par défaut
    Déjà un énorme merci pour t'être interessé à mon cas
    Il y a du mieux la boîte de dialogue de choix du répertoire se ferme ! En revanche la fenêtre principale ne se dessine pas tant que le fichier n'est pas téléchargé même avec un gtk_widget_show_all(p_gadget->fenetre[0]);

    Une idée pour que la fenêtre principale se dessine pendant le téléchargement ?

  7. #7
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    La fonction system(); est malheureusement pour toi bloquante. Tu peux utiliser l'équivalente de la glib qui elle n'est pas bloquante :
    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
    gboolean            g_spawn_command_line_async          (const gchar *command_line,
                                                             GError **error);
     
    A simple version of g_spawn_async() that parses a command line with g_shell_parse_argv() and passes it to g_spawn_async().
    Runs a command line in the background. Unlike g_spawn_async(), the G_SPAWN_SEARCH_PATH flag is enabled, other flags are not.
    Note that G_SPAWN_SEARCH_PATH can have security implications, so consider using g_spawn_async() directly if appropriate.
    Possible errors are those from g_shell_parse_argv() and g_spawn_async().
     
    The same concerns on Windows apply as for g_spawn_command_line_sync().
     
    command_line :
    	a command line
     
    error :
    	return location for errors
     
    Returns :
    	TRUE on success, FALSE if error is set.

  8. #8
    Membre confirmé Avatar de acryline
    Profil pro
    Inscrit en
    Août 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 200
    Par défaut
    Ok merci ! J'ai essayé la fonction de la Glib, ça fonctionne mais la fenêtre principale ne se dessine toujours pas. Là, je n'ai pas trop le temps j'étudie ça demain.
    Encore merci !

  9. #9
    Membre confirmé Avatar de acryline
    Profil pro
    Inscrit en
    Août 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 200
    Par défaut
    Maintenant tout fonctionne, j'avais deux commandes système et je n'en avais remplacée qu'une.
    Merci beaucoup pour ton aide

    Pour la barre de progression je regarde ton lien http://library.gnome.org/devel/glib/...ync-with-pipes

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 05/04/2015, 20h35
  2. Réponses: 2
    Dernier message: 16/03/2015, 21h19
  3. Réponses: 5
    Dernier message: 15/09/2011, 22h53
  4. Réponses: 1
    Dernier message: 02/08/2011, 12h48
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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