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 :

besoin aide gtk+


Sujet :

GTK+ avec C & C++

  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2007
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 60
    Par défaut besoin aide gtk+
    bonjour,

    j'ai un petit soucis dans la compréhension de l'utilisation de gtk+.
    J'utilise cett bibliothèque pour faire une interface graphique à un programme multi thread d'intelligence artificielle que j'ai fait.
    En fait si je comprends bien tout fonctionne par événements, le truc c'est qu'en fait dans mon programme il n' y a pas d'événement, c'est juste de l'affichage de texte et de dessins.
    Je voudrais savoir comment faire pour programmer qq chose qui va s'éxécuter pendant le déroulement de gtk_main(). En gros où je lance mes boucles de thread ?
    Faut t-il ajouter un callback sur la fenêtre autre que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    G_CALLBACK(gtk_main_quit)
    ?

    merci
    Log

  2. #2
    Membre confirmé
    Inscrit en
    Janvier 2007
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 60
    Par défaut
    tient en jetant un coup d'oeil au forum j'ai trouvé ça :
    http://gtk.developpez.com/faq/?page=...BOUCLE_idleadd

    Peut être que ça résoudrait mon pb nan ?

    J'essaierai dès que je retourne sous linux

    Log

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2007
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 60
    Par défaut
    bon ça a l'air de fonctionner....
    en revanche j'ai un pb bizarre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (Prog:7370): Gtk-CRITICAL **: gtk_label_set_markup: assertion `GTK_IS_LABEL (label)' failed
    en fait j'essaye de faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gtk_label_set_markup(GTK_LABEL(pLabel),"test affichage classique");
    ça marche très bien quand je le fais dans le main mais là je suis pas dans le main je suis dans une classe de mon programme. Je récupère un pointeur sur le label "pLabel" et j'essaye de changer sa valeur

    vous voyez le pb ?

    merci
    Log

  4. #4
    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 : 42
    Localisation : France

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

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

    Citation Envoyé par logarithme1984
    en revanche j'ai un pb bizarre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (Prog:7370): Gtk-CRITICAL **: gtk_label_set_markup: assertion `GTK_IS_LABEL (label)' failed
    en fait j'essaye de faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gtk_label_set_markup(GTK_LABEL(pLabel),"test affichage classique");
    ça marche très bien quand je le fais dans le main mais là je suis pas dans le main je suis dans une classe de mon programme. Je récupère un pointeur sur le label "pLabel" et j'essaye de changer sa valeur

    vous voyez le pb ?
    Oui pLabel ne contient pas l'adresse un GtkLabel. Le plus simple serait que tu poste un peux de code

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2007
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 60
    Par défaut
    bon alors j'ai changé qq trucs et j'ai plus le message d'erreur mais ça ne marche toujours pas. Voici comment c'est fait :
    je suis dans une classe chef_exploit, qui a un attribut privé GtkWidget* pLabel
    Dans le constructeur j'initialise ce label qui est passé en argument.

    Tous les éléments de la fenêtre sont créés dans mon main à partir de variables static :

    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
    gtk_init(&argc,&argv);
       	pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    	gtk_window_set_title(GTK_WINDOW(pWindow), "Les GtkBox");
        	gtk_window_set_default_size(GTK_WINDOW(pWindow),640, 480);
        	g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);
    	g_idle_add(fonction_thread,(gpointer)NULL);
     
    	/* Creation de la GtkBox verticale */
        	pHBox = gtk_hbox_new(TRUE, 0);
       	 /* Ajout de la GtkVBox dans la fenetre */
        	gtk_container_add(GTK_CONTAINER(pWindow), pHBox);
     
       	 /* Creation des boutons */
        	pLabel = gtk_label_new(NULL);
        	gtk_label_set_justify(GTK_LABEL(pLabel), GTK_JUSTIFY_LEFT);
     
        	pDrawing = gtk_drawing_area_new() ;
     
        	gtk_box_pack_start(GTK_BOX(pHBox), pLabel, TRUE, FALSE, 0);
        	gtk_box_pack_start(GTK_BOX(pHBox), pDrawing, TRUE, TRUE, 0);
        	g_signal_connect( G_OBJECT(pDrawing), "realize", G_CALLBACK(realisation), NULL ) ;
        	g_signal_connect( G_OBJECT(pDrawing), "expose_event", G_CALLBACK(rafraichissement), NULL ) ;
     
        	gtk_widget_show_all(pWindow);
     
    	gtk_main();
    dans l'éxécution parallele au main je fais (g_idle_add):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chef_exploitants* chef1 = new chef_exploitants(pLabel);
    Et puis ensuite dans une des méthodes de ma classe chef_exploit je veux afficher des trucs dans le label et je n'y arrive pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gtk_label_set_markup(GTK_LABEL(pLabel),"test affichage classique");
    sachant que si je met ce code dans le main directement ça marche.....

    voilà j'espère que c'est plus kler mais c'est pas facile parce que c'est un programme assez gros.....
    Il est peut être important de noter que la classe chef_exploit est instanciée et utilisée dans une routine de thread...

  6. #6
    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 : 42
    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 logarithme1984
    sachant que si je met ce code dans le main directement ça marche.....
    Vu que l'exécution est en parallèle, tu es sûr que le chef_exploitants est bien initialisé lorsque tu veux modifier le widget ?

    Citation Envoyé par logarithme1984
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chef_exploitants* chef1 = new chef_exploitants(pLabel)
    C'est du C++, je ne sais pas si le mélange des classes GTK+ et C++ soit une bonne idées

  7. #7
    Membre confirmé
    Inscrit en
    Janvier 2007
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 60
    Par défaut
    oui je suis sûre que mon chef exploitant est initialisé parce que si je met un printf au même endroit il s'affiche bien sur la console...
    Pour le C++ j'avais lu que gtk+ était bien compatible....

    sinon tu me conseillerais quoi d'autre ?

  8. #8
    Membre confirmé
    Inscrit en
    Janvier 2007
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 60
    Par défaut
    bon j'ai regardé un peu je vais essayer gtkmm, c'est spécialement pour C++, par contre ils mettent en dépendances gtk2.4 et moi j'ai gtk2.0

  9. #9
    Membre confirmé
    Inscrit en
    Janvier 2007
    Messages
    60
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 60
    Par défaut
    bon alors y a du nouveau
    J'ai refait en utilisant gtkmm.

    ALors voilà comment j'ai fait ça :
    J'ai créé une classe idle qui hérite de Gtk::window, j'ai une méthode on_idle qui me permet de lancer mes thread et donc mon programme.
    Dans la classe idle j'ai fait un singleton pour que toute les instance de la classe soit en fait la même.
    Ainsi ça me permet d'avoir accès au Label de n'importe où dans mon prog simplement en créant une instance de la classe.

    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
    #include<iostream>
    using namespace std;
    #include<vector>
    #include<gtkmm.h>
     
    class MyIdle : public Gtk::Window
    {
    public:
      MyIdle();
      Gtk::Label* get_Label(){return &m_Label;}
      static MyIdle* get_singleton()
      {
    	singleton=new MyIdle();
    	return singleton;
      }
      Gtk::Label m_Label;
     
    protected:
     
      bool on_idle();
     
     
      Gtk::HBox m_Box;
      Gtk::Frame m_Frame;
      static MyIdle* singleton;
    };
    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
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    #include<iostream>
    #include"idle.h"
    #include<pthread.h>
    #include"chef_exploit.h"
    #include"exploitant.h"
     
    MyIdle* MyIdle::singleton=NULL;
     
     
    vector<vector<int> > generation_scenar();
     
    /*----------routines des thread---------*/
    void* routine_chef_exploit(void* mess);
    void* routine_exploit(void* mess);
     
     
    MyIdle::MyIdle():
    m_Box(false, 5),
    m_Frame("Resultats"),
    m_Label("debut du programme", true)
    {
    	set_title("Intelligence artificielle");
      	set_border_width(5);
     
     	add(m_Box);
     
    	m_Label.set_justify(Gtk::JUSTIFY_LEFT);
      	m_Frame.add(m_Label);
      	m_Box.pack_start(m_Frame, Gtk::PACK_SHRINK);
     
      	//Glib::signal_timeout().connect( sigc::mem_fun(*this, &IdleExample::on_timer), 50 );
      	Glib::signal_idle().connect( sigc::mem_fun(*this, &MyIdle::on_idle) );
     
      	show_all_children();
     
     
    }
     
     
    bool MyIdle::on_idle()
    {
      	//déclaration et initialisation des thread
    	pthread_t thread1,thread2,thread3,thread4,thread5,thread6,thread7;
    	int rc1,rc2,rc3,rc4,rc5,rc6,rc7;
    	rc1=pthread_create(&thread1,NULL,routine_chef_exploit,(void*)NULL);
    	sleep(3);
    	rc2=pthread_create(&thread2,NULL,routine_exploit,(void*)1);
    	rc3=pthread_create(&thread3,NULL,routine_exploit,(void*)2);
    	rc4=pthread_create(&thread4,NULL,routine_exploit,(void*)3);
    	rc5=pthread_create(&thread5,NULL,routine_exploit,(void*)4);
    	rc6=pthread_create(&thread6,NULL,routine_exploit,(void*)5);
    	rc7=pthread_create(&thread7,NULL,routine_exploit,(void*)6);
     
    	pthread_join(thread1,NULL);
    	pthread_join(thread2,NULL);
    	pthread_join(thread3,NULL);
    	pthread_join(thread4,NULL);
    	pthread_join(thread5,NULL);
    	pthread_join(thread6,NULL);
    	pthread_join(thread7,NULL);
    }
     
    exploitant* creat_exploit(int nb)
    {
    	exploitant* expl;
    	expl=new exploitant(nb);
     
    	return expl;
    }
     
    vector<vector<int> > generation_scenar()
    {
    	...
    }
     
    void* routine_chef_exploit(void* mess)
    {
    	vector<vector<int> > scenario = generation_scenar();
    	chef_exploitants* chef1 = new chef_exploitants();
     
    	chef1->initi_scenar(scenario);
    	while(1)
    	{
    		sleep(1);
    		chef1->analyse_pb();
    	}
    }
     
    void* routine_exploit(void* mess)
    {
    	exploitant* exploit=creat_exploit((int)mess);
    	while(1)
    	{
    		sleep(1);
    		exploit->run();
    	}
    }
    Ca fonctionne bien tant que je n'essaye pas d'écrire qq chose dans le Label

    Voici l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (process:13359): GLib-GObject-CRITICAL **: gtype.c:2240: initialization assertion failed, use IA__g_type_init() prior to this function
    la classe idle fonctionne bien, le pb c'est juste quand j'ai ajouté

    Je comprends en fait bien le pb mais je ne vois pas comment le résoudre. En fait le problème c'est que les classes qui souhaitent afficher qq chose dans le label (chef_exploitant.h et exploitant.h) sont des classes instanciées par les thread et donc instanciées dans la classe idle elle même. Donc en gros je crée des instances d'idle dans des instances d'idle.....je pense que ça peut poser pb mais je ne vois pas comment faire autrement.
    Ce que je ne comprend pas c'est que c'est forcément possible de faire ce que je veux. Il y a forcément qq un un jour qui s'est servi de gtkmm juste pour afficher des résultats dans un label !!! C'est simplement ça que je veux faire moi !

    Merci d'avance
    Log

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

Discussions similaires

  1. besoin aide pour requête compliquée ......
    Par Ickou dans le forum Requêtes
    Réponses: 4
    Dernier message: 10/04/2006, 17h43
  2. [Thread][Progressmonitor] Besoin aide
    Par david06600 dans le forum Concurrence et multi-thread
    Réponses: 7
    Dernier message: 02/03/2006, 21h43
  3. Réponses: 9
    Dernier message: 10/02/2006, 17h24
  4. [HTML] Besoin aide sur scroll et balise
    Par Kerod dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 24/03/2005, 14h42
  5. débutant : besoin aide
    Par simon76 dans le forum Flash
    Réponses: 6
    Dernier message: 14/08/2003, 16h03

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