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 :

g_signal_emit transmet des données incorrectes :/


Sujet :

GTK+ avec C & C++

  1. #1
    Membre confirmé Avatar de Gamall
    Profil pro
    Étudiant ENSEA
    Inscrit en
    Août 2009
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant ENSEA

    Informations forums :
    Inscription : Août 2009
    Messages : 252
    Par défaut g_signal_emit transmet des données incorrectes :/
    Bonjour,

    J'ai un widget Gtk qui dérive de GtkListBox, dans ce widget, je crée un nouveau signal comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct _NetworkDeviceListWidgetClass {
    	GtkListBoxClass parent_class;
     
    	void (*device_found)(NetworkDeviceListWidget *, gulong ul_addr);
    };
    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
    static void network_device_list_widget_class_init(
    		NetworkDeviceListWidgetClass *class) {
    	GObjectClass *object_class = G_OBJECT_CLASS(class);
     
            /* ... */
     
    	class->device_found = network_device_list_widget_device_found;
     
            /* ... */
     
    	network_device_list_widget_signals[SIGNAL_DEVICE_FOUND] = g_signal_new(
    			"device-found", G_TYPE_FROM_CLASS(class), G_SIGNAL_RUN_FIRST,
    			G_STRUCT_OFFSET(NetworkDeviceListWidgetClass, device_found),
    			NULL,
    			NULL, g_cclosure_marshal_VOID__ULONG, G_TYPE_NONE, 0);
     
    }
    Et j’émets mon signal comme suit :

    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
    static gboolean network_device_scan_source_func(gpointer message,
    		gpointer user_data) {
    	NetworkDeviceListWidget *ndlw = NETWORK_DEVICE_LIST_WIDGET(user_data);
    	NetworkDeviceListWidgetPrivate *priv = ndlw->priv;
    	guint64 *u64_message;
    	guint32 u32_address;
    	gboolean exists;
     
    	u64_message = (guint64*) message;
    	u32_address = (*u64_message) & 0xffffffff;
    	exists = ((*u64_message) >> 32) & 0x1;
     
    	/* ... */
     
    	if (exists) {
    		gulong ul_send = (gulong)u32_address;
     
    		g_signal_emit_by_name(user_data, "device-found", 0, ul_send);
    	}
     
    	return G_SOURCE_CONTINUE;
    }
    Seulement quand ma fonction handler est appelée la valeur 'ul' reçue n'est pas la même que celle envoyée lors de l'émission du signal (en vérifiant avec gdb) :/

    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
    static void network_device_list_widget_device_found(NetworkDeviceListWidget *ndlw,
    		gulong ul) {
    	NetworkDeviceListWidgetPrivate *priv = ndlw->priv;
    	NetworkDevice *device;
    	GtkWidget *dw;
    	GError *p_e = NULL;
     
    	device = network_device_new_if_exists(network_iface_get_ip(priv->iface),
    			ul, &p_e);
    	if (!p_e) {
    		dw = network_device_widget_new(device);
    		gtk_list_box_prepend(GTK_LIST_BOX(ndlw), dw);
    		gtk_widget_show(dw);
    	}
    }
    Quelqu'un aurait une idée ?

    Merci

  2. #2
    Membre chevronné Avatar de Gaulouis
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2015
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Octobre 2015
    Messages : 252
    Par défaut
    Salut,

    Je pense à une faute de frappe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_signal_emit_by_name(user_data, "device-found", ul_send, 0);

    Bien à toi


    Edit:
    Et une erreur d'étourderie : g-signal-new
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    g_signal_new(
    			"device-found", G_TYPE_FROM_CLASS(class), G_SIGNAL_RUN_FIRST,
    			G_STRUCT_OFFSET(NetworkDeviceListWidgetClass, device_found),
    			NULL,
    			NULL, g_cclosure_marshal_VOID__ULONG, G_TYPE_NONE, 1, G_TYPE_ULONG);

  3. #3
    Membre confirmé Avatar de Gamall
    Profil pro
    Étudiant ENSEA
    Inscrit en
    Août 2009
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant ENSEA

    Informations forums :
    Inscription : Août 2009
    Messages : 252
    Par défaut
    Merci beaucoup et bien vu

  4. #4
    Membre confirmé Avatar de Gamall
    Profil pro
    Étudiant ENSEA
    Inscrit en
    Août 2009
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant ENSEA

    Informations forums :
    Inscription : Août 2009
    Messages : 252
    Par défaut
    Je fais face maintenant à un nouveau problème, le signal "attend" que le pointeur de souris se déplace sur la fenêtre ou que la fenêtre soit déplacée/passée au premier plan pour appeler mon callback :/

    Une idée ?

  5. #5
    Membre confirmé Avatar de Gamall
    Profil pro
    Étudiant ENSEA
    Inscrit en
    Août 2009
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant ENSEA

    Informations forums :
    Inscription : Août 2009
    Messages : 252
    Par défaut
    OK j'ai trouvé, j'ai un GThreadPool qui execute 16 threads en même temps, chacun de ces threads balancent des données dans une GAsyncQueue. Cette GAsyncQueue est lue par une GSource dans le thread principal à chaque donnée placée dans la queue. Pour une raison que je ne connais pas, le thread principal "s'endort" pendant que les threads continuent à envoyer leurs données. Le mouvement de la souris sur la fenêtre le réveil et donc il reçoit toutes les données d'un coup qui s'affichent. Le problème est donc résolu par un appel à g_main_context_wake_up(NULL) dans les threads

  6. #6
    Membre chevronné Avatar de Gaulouis
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2015
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Octobre 2015
    Messages : 252
    Par défaut
    La seule idée qui me viens c'est :


  7. #7
    Membre confirmé Avatar de Gamall
    Profil pro
    Étudiant ENSEA
    Inscrit en
    Août 2009
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant ENSEA

    Informations forums :
    Inscription : Août 2009
    Messages : 252
    Par défaut

  8. #8
    Membre confirmé Avatar de Gamall
    Profil pro
    Étudiant ENSEA
    Inscrit en
    Août 2009
    Messages
    252
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant ENSEA

    Informations forums :
    Inscription : Août 2009
    Messages : 252
    Par défaut
    J'ai modifié mon message du dessus.

Discussions similaires

  1. [Designer V5-V6] Liaisons incorrectes sur des données communes
    Par tang121 dans le forum Débuter
    Réponses: 15
    Dernier message: 06/07/2010, 16h14
  2. [PEAR][HTML_QuickForm] Récupération des données incorrecte
    Par ldv dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 23/07/2009, 16h52
  3. Réponses: 3
    Dernier message: 09/12/2007, 18h07
  4. Structure des données en retour d'un DBExtract ?
    Par mikouts dans le forum XMLRAD
    Réponses: 4
    Dernier message: 24/01/2003, 15h15
  5. Réponses: 2
    Dernier message: 18/12/2002, 10h30

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