Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 01/07/2011, à 15:48

Laserpithium

[Résolu] C++: envoyer des commandes à intervalle de temps divers

Bonjour,

J'ai créé un petit programme en C/C++ permettant d'envoyer des données sur le port série pour commander un contrôleur de led RGB.
En gros: j'appuie sur le bouton "Rouge" et les leds s'allument en rouge.

Je souhaite à présent aller un peu plus loin, et programmer des actions automatiques (par exemple, effets stroboscopiques): Chaque x secondes, le programme choisit une nouvelle couleur et l'envoie tout seul comme un grand sur le port série.
Ce que je ne sais pas faire, c'est ce "attend x secondes": je peux le faire via une sale boucle while, mais ça me fait mal d'avoir le proco à 100%.
Utiliser la fonction sleep pourrait marcher, mais cela implique de passer par un thread si je veux garder mon interface graphique active n'est-ce pas ? Je ne connais pas trop les threads et je ne vois donc pas si cela me permet de faire ce que je veux.

Idéalement, il faudrait construite cela de le manière suivante:
- Le programme principal (qui fait tourner l'interface graphique typiquement) envoie des commandes toutes les x secondes (x par forcément constant).
- Un programme secondaire est "éveillé" lors de l'émission de ce signal, il envoie la commande aux LED puis se remet en sommeil.
Comment faire pour que le programme principal émette ce signal ponctuellement, sans avoir une sale boucle while qui tourne pour incrémenter une variable servant de timer ?

Dernière modification par Laserpithium (Le 02/07/2011, à 22:41)


Portable Toshiba P300-220, proc P8300 Core2Duo 4Go RAM CG ATI HD4650 Mobility
Archlinux 64bits
GE>$ d s++:-- a- C++ L+++ P W++(+++) w--@ PE+ Y+ !R tv-() b+++ e+++ r-->r y>y+

Hors ligne

#2 Le 01/07/2011, à 16:25

claudius01

Re : [Résolu] C++: envoyer des commandes à intervalle de temps divers

Bonjour,

La fonction alarm devrait répondre à ton problème et pas besoin d'un second process
cf. man alarm


Cordialement, A+
--
Claudius

Hors ligne

#3 Le 01/07/2011, à 19:00

omc

Re : [Résolu] C++: envoyer des commandes à intervalle de temps divers

Bonjour,
Tu utilises quel lib pour l'interface graphique ?

Hors ligne

#4 Le 01/07/2011, à 19:36

Laserpithium

Re : [Résolu] C++: envoyer des commandes à intervalle de temps divers

omc a écrit :

Bonjour,
Tu utilises quel lib pour l'interface graphique ?

Qt (KDE power cool)

Mais la partie communication client/serveur et la communication avec le port série est faite en C.


Portable Toshiba P300-220, proc P8300 Core2Duo 4Go RAM CG ATI HD4650 Mobility
Archlinux 64bits
GE>$ d s++:-- a- C++ L+++ P W++(+++) w--@ PE+ Y+ !R tv-() b+++ e+++ r-->r y>y+

Hors ligne

#5 Le 02/07/2011, à 07:39

omc

Re : [Résolu] C++: envoyer des commandes à intervalle de temps divers

Re !
Dans ce cas je dirais que QTimer est ton ami.
Pas besoin de thread (qt le fait pour toi).
Il te suffit de creer un QTimer, de donner l'intervalle de temps de déclenchement avec "setInterval()" est de connecter le signal du timer "timeout()"
à un de tes slots.
Dans ton cas le slot doit déclencher un effet stromboscopique.

Cette solution me parait être la plus simple,
Bon courage !

Hors ligne

#6 Le 02/07/2011, à 18:17

Laserpithium

Re : [Résolu] C++: envoyer des commandes à intervalle de temps divers

claudius01 a écrit :

Bonjour,
La fonction alarm devrait répondre à ton problème et pas besoin d'un second process
cf. man alarm

Essayé avec alarm(), ça marche nickel, exactement ce que je cherchais, merci !

Une question cependant:
- J'ai alarm() qui prend en paramètre un nombre entier de secondes (testé et fonctionne)
- J'ai ualarm() qui prend en paramètre un nombre entier de microsecondes (testé et fonctionne)
Donc actuellement je sais attendre entre deux commandes un nombre entier de seconde, mais ualarm() ne fonctionne pas chez moi si je passe en paramètre plus de 1 million de microsecondes.

Donc comment est-ce que je peux faire pour attendre par exemple 1.3 secondes ?

Dernière modification par Laserpithium (Le 02/07/2011, à 18:18)


Portable Toshiba P300-220, proc P8300 Core2Duo 4Go RAM CG ATI HD4650 Mobility
Archlinux 64bits
GE>$ d s++:-- a- C++ L+++ P W++(+++) w--@ PE+ Y+ !R tv-() b+++ e+++ r-->r y>y+

Hors ligne

#7 Le 02/07/2011, à 18:57

grim7reaper

Re : [Résolu] C++: envoyer des commandes à intervalle de temps divers

Laserpithium a écrit :

ualarm() ne fonctionne pas chez moi si je passe en paramètre plus de 1 million de microsecondes.

Y'a pas que chez toi hein, c'est normal.

man 3 ualarm a écrit :

The  type useconds_t is an unsigned integer type capable of holding integers in the range [0,1000000].

Hors ligne

#8 Le 02/07/2011, à 19:12

Laserpithium

Re : [Résolu] C++: envoyer des commandes à intervalle de temps divers

grim7reaper a écrit :
Laserpithium a écrit :

ualarm() ne fonctionne pas chez moi si je passe en paramètre plus de 1 million de microsecondes.

Y'a pas que chez toi hein, c'est normal.

man 3 ualarm a écrit :

The  type useconds_t is an unsigned integer type capable of holding integers in the range [0,1000000].

OK, du coup de fait quoi ?

ça voudrait dire que je peux additionner les délais en appelant à la suite alarm() et ualarm() ?


Portable Toshiba P300-220, proc P8300 Core2Duo 4Go RAM CG ATI HD4650 Mobility
Archlinux 64bits
GE>$ d s++:-- a- C++ L+++ P W++(+++) w--@ PE+ Y+ !R tv-() b+++ e+++ r-->r y>y+

Hors ligne

#9 Le 02/07/2011, à 19:56

grim7reaper

Re : [Résolu] C++: envoyer des commandes à intervalle de temps divers

Laserpithium a écrit :

ça voudrait dire que je peux additionner les délais en appelant à la suite alarm() et ualarm() ?

Hum non, je serais toi je regarderais plutôt du côté de setitimer.
Ça donnerait un code de ce genre :

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

#include <signal.h>

#include <sys/time.h>

void strombos(int sig_id)
{
    (void)sig_id;
    puts("plop");
}

int main(void)
{
    struct itimerval interval = {{1, 300000}, {1,300000}};

    if(setitimer(ITIMER_REAL, &interval, NULL) == -1)
        perror("setitimer");
    else
    {
        struct sigaction sa;

        sa.sa_handler = strombos;
        sa.sa_flags = 0;
        sigemptyset(&(sa.sa_mask));

        if(sigaction(SIGALRM, &sa, NULL) == -1)
            perror("sigaction");
        else
        {
            while(1)
                ;
        }
    }

    return EXIT_SUCCESS;
}

Jte laisse lire les man pour comprendre les paramètres (mais si y'a des trucs que tu comprends pas tu peux demander ici).
Bon y'a 2-3 trucs crado dans dans le code, c'est un peu pondu à l'arrache hein.
À voir aussi les flags que je passe, faut peut‑être que t'en utilise d'autres selon ce que tu veux faire (le man est ton ami :])



Édit : j'ai corrigé le code, c'est 300 000 et non pas 300…

Dernière modification par grim7reaper (Le 27/08/2013, à 17:59)

Hors ligne

#10 Le 02/07/2011, à 22:35

Laserpithium

Re : [Résolu] C++: envoyer des commandes à intervalle de temps divers

Génial, ça marche !

Merci à tous


Portable Toshiba P300-220, proc P8300 Core2Duo 4Go RAM CG ATI HD4650 Mobility
Archlinux 64bits
GE>$ d s++:-- a- C++ L+++ P W++(+++) w--@ PE+ Y+ !R tv-() b+++ e+++ r-->r y>y+

Hors ligne

#11 Le 02/07/2011, à 22:39

grim7reaper

Re : [Résolu] C++: envoyer des commandes à intervalle de temps divers

Cool, pense à passer le sujet en résolu wink

Hors ligne