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 :

Création d'un monitor


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Mayhem555
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 89
    Par défaut Création d'un monitor
    Salut à tous.

    Je cherche à programmer un petit utilitaire sous GNome qui serait du style "System Monitor", qui permettrais donc de controller de manière graphique (avec GTK+ si possible) un autre programme que j'ai déjà fait (genre avoir un bouton graphique pour le démarrer, l'arrêter, etc.)

    Ce programme que je dois "surveiller" tourne en tâche de fond et génère des fichiers log. J'aimerai que mon monitor puisse récupérer ces fichiers log afin de tracer un graphique d'activité (un peu comme sous Win ou Linux quand on voit l'occupation de la mémoire vive, sauf que je n'ai pas besoin du temps réel).

    Voilà, le truc c'est que je n'y connais que dalle en GTK+, et que je ne sais pas trop quels outils peuvent me servir pour me lancer dans ce truc là. (le langage C m'est imposé). Quels outils me conseillez vous pour par exemple, tracer un graphique, récupérer l'état d'un process, etc..??

    Je sais que ma question est quelque peu vague, mais je suis dans le flou moi-même...

    Merci les amis

  2. #2
    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 : 55
    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
    M'est avis il y a deux manières d'aborder le problème.
    • Soit tu lances ton application depuis une autre application.
    • Soit tu lances une application qui lit à intervalle régulier le fichier log pour en extraire les données utiles.

    Dans le premier cas la Glib met à ta disposition les fonctions suivantes.
    Dans le deuxième cas c'est de la programmation pure. Lecture d'un fichier et traitement des données. La Glib met aussi des fonctions à ta disposition pour le traitement des chaines de caractère.

    Enfin graphiquement GTK+ peut répondre sans problème à ton cahier des charges. Dessiner des graphiques ne pose pas vraiment de gros problèmes, lire à intervalle régulier, c'est aussi possible en toute simplicité.

  3. #3
    Membre confirmé Avatar de Mayhem555
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 89
    Par défaut
    Merci beaucoup gerald3d pour cette réponse très intéressante. Je vais regarder de près cette librairie Glib.

  4. #4
    Membre confirmé Avatar de Mayhem555
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 89
    Par défaut
    Bonjour !

    Me revoilà pour une seconde question, toujours sur le même projet.

    Dans mon application de monitoring, je souhaite être au courant des démons qui sont lancés (il y en a 4).
    J'ai déjà créé une fonction permettant de savoir si un processus est démarré selon son nom, mais maintenant je voudrais qu'il y ait 4 petites LED (des fichiers gif) qui soient chacune rouges ou vertes selon l'état du processus correspondant.

    Par conséquent, je voudrais appeler ma fonction qui vérifie chacun des 4 états le plus souvent possible.
    Après avoir lu quelques trucs dans les FAQ, je pensait qu'il serait bien de rajouter cette fonction dans la boucle principale de GTK, mais je n'arrive pas à grand chose.

    Le prototype de ma fonction est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int isStarted (const char *process_name) ;
    Elle renvoie 1 si le process est démarré, 0 sinon.

    Est-ce que quelqu'un pourrait m'expliquer comment implémenter cette fonctionnalité ?? Merci beaucoup !

  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 : 55
    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
    Pour insérer une fonction dans la boucle GTK+ il suffit d'utiliser la fonction suivante :
    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
    guint               g_timeout_add                       (guint interval,
                                                             GSourceFunc function,
                                                             gpointer data);
     
    Sets a function to be called at regular intervals, with the default priority, G_PRIORITY_DEFAULT. The function is called repeatedly until it returns FALSE, at which point the timeout is automatically destroyed and the function will not be called again. The first call to the function will be at the end of the first interval.
     
    Note that timeout functions may be delayed, due to the processing of other event sources. Thus they should not be relied on for precise timing. After each call to the timeout function, the time of the next timeout is recalculated based on the current time and the given interval (it does not try to 'catch up' time lost in delays).
     
    If you want to have a timer in the "seconds" range and do not care about the exact time of the first call of the timer, use the g_timeout_add_seconds() function; this function allows for more optimizations and more efficient system power usage.
     
    interval :
    	the time between calls to the function, in milliseconds (1/1000ths of a second)
     
    function :
    	function to call
     
    data :
    	data to pass to function
     
    Returns :
    	the ID (greater than 0) of the event source.
    Avec cette fonction on indique l'intervalle de temps entre chaque appel, la fonction à appeler et on peut en plus envoyer à la fonction appelée une donnée utilisateur.
    Le prototype de la fonction appelée est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    gboolean            (*GSourceFunc)                      (gpointer data);
     
    Specifies the type of function passed to g_timeout_add(), g_timeout_add_full(), g_idle_add(), and g_idle_add_full().
     
    data :
    	data passed to the function, set when the source was created with one of the above functions.
     
    Returns :
    	it should return FALSE if the source should be removed.
    Comme tu peux le voir ca ne correspond pas bien avec ta fonction. Mais ce n'est pas un problème. Crées une fonction avec le bon prototype. A l'intérieur tu appelles ta propre fonction. Le tour est joué.

    Remarque :
    Il existe des LEDs toutes faites : GTK_STOCK_YES et GTK_STOCK_NO. Bien sûr tu peux toujours utiliser les tiennes pour apporter une touche personnelle à ton application.

  6. #6
    Membre confirmé Avatar de Mayhem555
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 89
    Par défaut
    Merci gerald.

    J'ai bien réussi à faire appeler ma fonction en passant via une callback et en l'ajoutant à la boucle principale de GTK+.

    Ma callback renvoie le status de mon process par le gpointer userdata (qui est passé en paranetre), est-ce une bonne pratique ? Je ne vois pas comment comment récupérer les valeurs de retour dans mon programme autrement.

    Mon autre probleme est de changer la led de couleur une fois que j'ai la valeur de retour de ma fonction...

    Pour le moment, il s'agit juste d'une image qui ne réagit à rien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    imageled =  gtk_image_new_from_file("icons/green_led.gif");
    J'aimerai pouvoir changer dynamiquement cette image, en la remplaçant par red_led.gif lorsque le process est détecté comme non lancé.

    J'ai du mal à conceptualiser comment faire. Faut-il que ma callback qui renvoie le status du process renvoie plutôt un signal ? Dans ce cas comment faire pour que mon image réagisse à ce signal en changeant l'URL du fichier image ??

    Merci pour votre aide.

Discussions similaires

  1. Classe pour la création d'un graphe xy
    Par Bob dans le forum MFC
    Réponses: 24
    Dernier message: 03/12/2009, 17h20
  2. création d'un scanserveur (monitoring)
    Par lylou dans le forum Programmation et administration système
    Réponses: 1
    Dernier message: 03/05/2006, 22h08
  3. [Kylix] Création d'un fichier lien
    Par DrQ dans le forum EDI
    Réponses: 2
    Dernier message: 14/05/2002, 21h30
  4. Création image BMP
    Par Anonymous dans le forum C
    Réponses: 2
    Dernier message: 25/04/2002, 16h04

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