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 :

blocage threads glib


Sujet :

GTK+ avec C & C++

  1. #1
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 13
    Par défaut blocage threads glib
    bonjour

    pour mon application j'ai besoin qu'une fonction tourne en arrière plan sans bloquer l'interface graphique, cette fonction va contenir une boucle infini qui va faire quelque vérification et va afficher une boite de dialogue comme le font les antivirus .

    alors voila un code avec une fonction main et une fonction alerte qui se bloque avec les threads de la glib.


    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <gtk/gtk.h>
    #include <glib.h>
     
    void *alert (gpointer *data)
    {
        /****code pour une boite de dilogue*****/
    GtkWidget *dialog = NULL;
    dialog = gtk_message_dialog_new (GTK_WINDOW (NULL), GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, "alert");
    gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER);
    gtk_dialog_run (GTK_DIALOG (dialog));
    gtk_widget_destroy (dialog);
    g_thread_exit (0);
     
      }
     
    int main (int argc, char *argv[])
    {
     
    GtkWidget *win = NULL;
    gtk_init (&argc, &argv);
     
    g_thread_init (NULL);
     
    /****  creation de la fenetre principale*****/
    win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
      gtk_container_set_border_width (GTK_CONTAINER (win), 8);
      gtk_window_set_default_size(GTK_WINDOW(win), 500, 500);
      gtk_window_set_title (GTK_WINDOW (win), "fenetre principale");
      gtk_window_set_position (GTK_WINDOW (win), GTK_WIN_POS_CENTER);
      g_signal_connect (win, "destroy", gtk_main_quit, NULL);
        gtk_widget_show_all (win);
    /*************************************************************/
     
    g_thread_create (alert, NULL, FALSE, NULL);
      gtk_main ();
      return 0;
    }

    merci pour votre aide.

  2. #2
    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,

    Mon programme se bloque lorsque j'utilise les threads ?

    En me relisant, la réponse n'est peut être pas très clair

    Il ne faut pas utiliser les g_thread lorsque tu utilise gtk. Il faut utiliser g_idle_add. Si l'affiche se bloque toujours, il faut essayer de redonner la main à gtk pour qu'il rafraichisse l'affichage.

  3. #3
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 13
    Par défaut
    j'ai deja essayé d'utiliser g_idle_add mais elle est bloquante, et moi je veux faire une boucle infini en arrière plan de l'application, j'ai essayer aussi les threads de gdk et c'est le même problème.

    si vous pouvez me faire un petit exemple avec la glib ou avec les threads de la gdt qui marche.

    merci

  4. #4
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 13
    Par défaut
    j'ai essayé de le faire avec les threads GDK comme c'est décrit ici http://developer.gnome.org/doc/API/2...k-Threads.html mais ça marche toujours pas.

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <gtk/gtk.h>
    #include <glib.h>
    #include <pthread.h>
     
    void *alert (gpointer *data)
    {
        /****code pour une boite de dilogue*****/
            gdk_threads_enter ();
    GtkWidget *dialog = NULL;
    dialog = gtk_message_dialog_new (GTK_WINDOW (NULL), GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, "alert");
    gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER);
    gtk_dialog_run (GTK_DIALOG (dialog));
    gtk_widget_destroy (dialog);
           gdk_threads_leave ();
     
     
      }
     
     
     
     
    int main (int argc, char *argv[])
    {
     
    GtkWidget *win = NULL;
     
      g_thread_init (NULL);
      gdk_threads_init ();
      gdk_threads_enter ();
      gtk_init(&argc, &argv);
     
    /****  creation de la fenetre principale*****/
    win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
      gtk_container_set_border_width (GTK_CONTAINER (win), 8);
      gtk_window_set_default_size(GTK_WINDOW(win), 500, 500);
      gtk_window_set_title (GTK_WINDOW (win), "fenetre principale");
      gtk_window_set_position (GTK_WINDOW (win), GTK_WIN_POS_CENTER);
      g_signal_connect (win, "destroy", gtk_main_quit, NULL);
        gtk_widget_show_all (win);
    /*************************************************************/
     
     
     pthread_t ta;
    pthread_create( &ta,NULL, alert,NULL);
     
      gtk_main ();
      return 0;
    }

    mon but est d'afficher une boite de dilogue avec un thread sans bloquer l'interface.
    merci de votre aide les amis.

  5. #5
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 13
    Par défaut
    voilà , j'ais edité mon code et jais ajouté g_idle_add au thread alert() . comme ca

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <gtk/gtk.h>
    #include <glib.h>
     
     
      gboolean *alert2 (gpointer *data)
    {
        /****code pour une boite de dilogue*****/
    GtkWidget *dialog = NULL;
    dialog = gtk_message_dialog_new (GTK_WINDOW (NULL), GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, "alert");
    gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER);
    gtk_dialog_run (GTK_DIALOG (dialog));
    gtk_widget_destroy (dialog);
     
     
      }
     
    void *alert (gpointer *data)
    {
     
    g_idle_add (alert2,NULL);
      }
     
     
     
    int main (int argc, char *argv[])
    {
     
    GtkWidget *win = NULL;
    gtk_init (&argc, &argv);
     
    g_thread_init (NULL);
     
    /****  creation de la fenetre principale*****/
    win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
      gtk_container_set_border_width (GTK_CONTAINER (win), 8);
      gtk_window_set_default_size(GTK_WINDOW(win), 500, 500);
      gtk_window_set_title (GTK_WINDOW (win), "fenetre principale");
      gtk_window_set_position (GTK_WINDOW (win), GTK_WIN_POS_CENTER);
      g_signal_connect (win, "destroy", gtk_main_quit, NULL);
        gtk_widget_show_all (win);
    /*************************************************************/
     
    g_thread_create (alert, NULL, FALSE, NULL);
      gtk_main ();
      return 0;
    }

    alors maintenant il y a le thread alert qui appel la fonction alert2.
    là tout va bien, mais quand j'essay de mettre une boucle infini à la fonction alert2() .
    l'interface se bloque et je ne peux pas fermer la fenêtre principale,

    merci de me corriger le code

  6. #6
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 13
    Par défaut
    bonjour

    le problème est résolu.

    il faut juste appeler dans le thread nos fonctions avec g_idle_add() pour que ça bloc pas. comme ceci:


    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
     
    #include <stdio.h>  
    #include <stdlib.h>  
    #include <gtk/gtk.h>  
    #include <glib.h>  
     
     
     
    gpointer *alert (gpointer *data)  
    {  
    //la foction lancé par le thread  
     
    while(1)  
    {  
     /*et dans cette boucle si on veut afficher une boite de dialogue il faut mettre son code dans une fonction à part et de l'appeler avec g_idle_add()*/ 
        sleep(1);  
     
    }  
      }  
     
     
     
    int main (int argc, char *argv[])  
    {  
     
    GtkWidget *win = NULL;  
    gtk_init (&argc, &argv);  
     
    g_thread_init (NULL);  
     
    /****  creation de la fenetre principale*****/  
    win = gtk_window_new (GTK_WINDOW_TOPLEVEL);  
      gtk_container_set_border_width (GTK_CONTAINER (win), 8);  
      gtk_window_set_default_size(GTK_WINDOW(win), 500, 500);  
      gtk_window_set_title (GTK_WINDOW (win), "fenetre principale");  
      gtk_window_set_position (GTK_WINDOW (win), GTK_WIN_POS_CENTER);  
      g_signal_connect (win, "destroy", gtk_main_quit, NULL);  
        gtk_widget_show_all (win);  
    /*************************************************************/  
     
     
     
    g_thread_create (alert, NULL, FALSE, NULL);  
      gtk_main ();  
      return 0;  
    }

    merci.
    a+

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

Discussions similaires

  1. Blocage, thread et pipes
    Par ernie74 dans le forum Framework .NET
    Réponses: 5
    Dernier message: 14/07/2011, 11h10
  2. Blocage Thread D7 FB1.5 DbExpress
    Par gudul dans le forum Bases de données
    Réponses: 4
    Dernier message: 01/06/2007, 09h14
  3. Réponses: 2
    Dernier message: 02/03/2007, 02h23
  4. [Thread] probléme de blocage.
    Par airod dans le forum Tkinter
    Réponses: 6
    Dernier message: 07/11/2006, 14h21
  5. [Thread] Blocage dans mon programme
    Par Xo Sonic oX dans le forum EDT/SwingWorker
    Réponses: 4
    Dernier message: 18/06/2005, 17h12

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