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 :

arret d'un gthreads


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 5
    Par défaut arret d'un gthreads
    Bonjour,
    j'ai un probleme pour arreter l'exécution d'un thread comme je le souhaite...

    J'ai une fenetre principale avec un bouton qui exécute un thread et ouvre une autre fenetre lorsqu'on clique sur un bouton. Dans cette deuxieme fenetre il y a un bouton quitter qui permet de fermer cette fenetre et qui devrait arreter l'exécution du thread.
    J'ai pour cela utilisé la fonction g_thread_exit(0) dans la fonction CALLBACK du bouton.

    Mon probleme est que le bouton quitter ferme toute l'application alors que je voudrais que la fenetre principale reste affichée pour éventuellement relancer le thread...

    Je ne vois pas trop comment faire sans l'utilisation des thread pour que mon interface ne soit pas bloquée et que je puisse lancer et arreter ma fonction quand je le souhaite...

    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    #include <stdlib.h>
    #include <gtk/gtk.h>
    #include <glib.h>
    #include "TraitementTrame.h"
     
    void lancement_app(GtkWidget *pButton, gpointer data);
    int ferm_app(GtkWidget *pButton, gpointer data);
     
    int main(int argc, char **argv)
    {
        GtkWidget *pWindow;
        GtkWidget *pVBox;
        GtkWidget *pButton;
        gchar* titreUTF8; // Pour ranger le titre convertit
     
        gtk_init(&argc,&argv); // Initialisation de GTK
        g_thread_init(NULL);
     
        pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL); // Création de la fenètre
        titreUTF8 = g_locale_to_utf8("Création du fichier XML", -1, NULL, NULL, NULL); // Conversion du titre en utf8
     
        gtk_window_set_title(GTK_WINDOW(pWindow), titreUTF8); // Titre de la fenètre
        gtk_window_set_default_size(GTK_WINDOW(pWindow), 320, 200); // Taille par défaut
        g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL); // Connexion au signal de destruction
     
        pVBox = gtk_vbox_new(TRUE, 0); // Création de la box
        gtk_container_add(GTK_CONTAINER(pWindow), pVBox); // Ajout de la box à la fenètre principale
     
        pButton = gtk_button_new_with_label("Lancement de l'application"); // Création du bouton
        gtk_box_pack_start(GTK_BOX(pVBox), pButton, TRUE, FALSE, 0); // Ajout du bouton ds la box
     
        /* Connexion du signal "clicked" du GtkButton */
        /* La donnee supplementaire est la GtkVBox pVBox */
        g_signal_connect(G_OBJECT(pButton), "clicked", G_CALLBACK(lancement_app), (GtkWidget*) pVBox);
        g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);
     
        gtk_widget_show_all(pWindow); // Affichage de la fenètre
     
        gtk_main(); // Lancement de la boucle évènementielle
     
        return EXIT_SUCCESS;
    }
     
    void lancement_app(GtkWidget *pButton, gpointer data)
    {
        GtkWidget *fenetreBarre;
        GtkWidget *boutonQuit;
        gchar* titreFBarreUTF8;
        GThread* thread_trait_tram;
     
     
        thread_trait_tram = g_thread_create(TraitementTrame, NULL, FALSE, NULL);
        titreFBarreUTF8 = g_locale_to_utf8("Réception des coordonnées en cours...", -1, NULL, NULL, NULL); // Conversion du titre
     
        fenetreBarre = gtk_window_new(GTK_WINDOW_TOPLEVEL); // Création fenetre
        gtk_window_set_title(GTK_WINDOW(fenetreBarre),titreFBarreUTF8); // Titre de la fenetre
        gtk_window_set_default_size(GTK_WINDOW(fenetreBarre),150, 100); // Taille de la fenetre
        gtk_window_set_position(GTK_WINDOW(fenetreBarre),GTK_WIN_POS_CENTER); // Position de la fenetre
     
        boutonQuit = gtk_button_new_with_label("Arreter l'application"); // Création du bouton quitter
        g_signal_connect(G_OBJECT(boutonQuit), "clicked", G_CALLBACK(ferm_app), fenetreBarre);
        gtk_container_add(GTK_CONTAINER(fenetreBarre), boutonQuit);
     
        gtk_widget_show_all(fenetreBarre); // Affichage de la fenetre
    }
     
    int ferm_app(GtkWidget *boutonQuit, gpointer fenetreBarre)
    {
       gtk_widget_destroy(fenetreBarre);
       g_thread_exit(0);
    }
    La fonction TraitementTrame lancée par mon thread se trouve dans un autre fichier et est assez longue, c'est pr ca que je ne l'ai pas mise la...

  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
    La fonction callback de ton bouton est probablement appelée depuis le thread principal, donc si tu fasi un g_thread_exit dans ton thread principal, c'est normal que ton programme s'arrête.
    SI ton thread a une boucle du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    while (TRUE) {
       do_stuff();
    }
    tu dois pouvoir te débrouiller pour lui indiquer de quitter après l'appui sur le bouton

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 5
    Par défaut
    mon thread était effectivement de type

    while(1)
    {
    ...
    }


    J'ai utilisé une variable globale dont je modifie la valeur en cliquant sur le bouton quitter qui me permet de sortir de la boucle..

    Donc ca marche!

    Merci !

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

Discussions similaires

  1. boucle avec condition d'arret changeante
    Par NicoH dans le forum Langage
    Réponses: 3
    Dernier message: 10/06/2003, 11h48
  2. j'arrive pas a arreter mon thread d'arriere-plan
    Par ms91fr dans le forum Langage
    Réponses: 6
    Dernier message: 06/06/2003, 21h36
  3. [UDP][Socket] perte de paquets et arret d'ecoute sur port
    Par Guismo1979 dans le forum Développement
    Réponses: 6
    Dernier message: 02/01/2003, 12h13
  4. probleme a l'arret de threads
    Par Sei dans le forum C++Builder
    Réponses: 5
    Dernier message: 16/12/2002, 12h15
  5. Detection arret de windows
    Par philippe30 dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 21/09/2002, 18h41

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