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

C++ Discussion :

[MT] Essayer de lancer une fonction - Multithreading?


Sujet :

C++

  1. #1
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut [MT] Essayer de lancer une fonction - Multithreading?
    Bonjour à tous,

    Je suis complètement débutant en Multithreading (enfin ça remonte à loin).
    Je traverse actuellement un problème, qui je pense, ne peut être traité que par du multi-tâche...

    Dans mon programme je dois effectuer une connexion sur un serveur afin de récupérer une donnée. La plupart du temps, le serveur est dispo. J'aimerais cependant que mon programme ne plante pas lamentablement quand il ne l'est pas...
    J'ai pensé à éxécuter ma fonction pour aller chercher la donnée réseau sur une tâche parallèle. Si au bout d'un certain temps (5 à 10 secondes) il ne s'est rien passé, je termine le thread et j'informe l'utilisateur d'un problème réseau.

    Qu'en pensez-vous?

    Je suis actuellement en train de me renseigner sur les Threads de Boost, ainsi que le tuto de Miles associé...

    Merci pour votre aide!

  2. #2
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Chez boost tu as aussi asio ( http://asio.sf.net/ ) qui balance des exceptions en cas d'erreurs.
    Je pense que gérer des exceptions en lieu et place des if(!connected) peut être pas mal. Ca peut simplifier les choses.

  3. #3
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Mon code actuel est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void Filtre::initFiltre()
    {
    	m_nom_fichier_brillance = "filtre" + to_string(m_numero_camera) + ".txt"; // filtre1.txt, filtre2.txt etc...
    	m_nom_fichier_flux =  "flux" + to_string(m_numero_camera) + ".txt";
     
    	LitTopInt(getChocNum(), "DVISCCD", "FILTRE", "NUM", &m_numero_filtre);
    }
    Et la fonction LitTopInt est assez pourrie (en C, pas de gestion d'erreurs)... J'aurais aimé une petite levée d'exception, mais bon...
    Cette fonction pose problème, alors l'éxécuter dans un thread serait peut-être une bonne idée...

    Alp, j'ai peur de ne pas avoir compris ce que tu voulais me dire... Tu pourrais expliquer un peu plus s'il te plaît ? Merci !

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Tu n'as pas besoin de multi-tâche du tout.
    C'est une simple question de timeout.

  5. #5
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Citation Envoyé par loufoque
    Tu n'as pas besoin de multi-tâche du tout.
    C'est une simple question de timeout.
    Oui, c'était ma première idée... Mais comment faire? Un fois le programme rentré dans la fonction LitTopInt, mon programme est bloqué non?
    La fonction LitTopInt n'a pas écrit écrit par mes soins (je l'ai en version dll ).

    Comment intégrer un timeout?

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Si tu es bloqué avec une fonction pré-écrite bidon, il te faut un genre de thread effectivement...

  7. #7
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    On est d'accord Loufoque

    D'après ce que j'ai compris, il va falloir:
    1) Lancer un thread avec ma fonction C pourrie.
    2) Mon programme principal attend le thread précédent
    3) Deux cas :
    • Mon thread se termine rapidement : OK et fin du thread
    • Le thread prend trop de temps -> on termine le thread.

    4) reprise du programme principal


    Il me me reste plus qu'à trouver comment implémenter ça avec Boost, i.e l'attente, la terminaison du thread, et la reprise du programme principal...

    Il ne me reste plus qu'à me creuser un peu le tête

  8. #8
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Il me semble que tu ne peux pas arrêter un thread en cours d'execution avec boost.

  9. #9
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Zut... Alors mon problème n'a pas de solution...

  10. #10
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Ceci dit d'autres bibliothèques le permettent. Ne me demande pas lesquelles, mais en tout cas les APIs bas niveau (Win32, pthreads) permettent de le faire. Par contre ce ne sera pas toujours très propre, par exemple sous Windows la fonction TerminateThread ne garantit pas que toutes les ressources allouées par le thread seront libérées.

  11. #11
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Il n'y a pas de moyen de transmettre une info ou quoi au thread exécuté durant son exécution ?

  12. #12
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Heu, juste histoire de faire peut etre avancer le chmilblick...

    A tout hasard, LitTopInt renvoie quelque chose (ce serait peut etre trop beau qu'elle renvoie un pointeur)

    Est-il exclu de penser que, à défaut d'avoir une exeption "C++", elle renvoie, ce qui serait génial, un pointeur NULL si elle échoue

    Quel est le but réel de cette fonction
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  13. #13
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Merci à tous de m'aider dans ce bazar...

    Alors voilà la fonction LitTopInt:
    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
    short LitTopInt(long nchoc, char *NmProd, char *NmObj, char *NmPar, int *Val)
    {
        long   cr, LgPar, NbVal;
        long  format;
        float  TelR;
        char  *Valeur = NULL;
     
        LgPar = 256;  // Nb max de valeurs à lire
     
        cr = TSRqParm (nchoc, NmProd, NmObj, NmPar, LgPar, &Valeur, &NbVal , &format); // PROBLEME ICI
     
        if (cr != 0)
            {
            printf("Erreur lecture %s / %s\n",NmObj,NmPar); *Val = -1.;
            return(-1);
            }
    }
    C'est l'appel à TSRqParm qui pose problème... Quand je trace mon problème au déboggeur, il ne passe pas cette ligne. C'est à dire qu'il lance l'appel à TSRqParm, et le programme se perd dans cette fonction, pour laquelle je n'ai pas le code source (uniquement sous forme lib / dll)...
    Rien n'est renvoyé, pas d'exception levée, RIEN !

    En temps normal, la fonction renvoie 0, et quand je l'éxécute depuis mon PC perso chez moi, elle renvoie -3 ou autre code d'erreur. Mais là dans ce cas précis où je le fais du travail, et que tout le réseau est HS, ça plante.

    Je vais voir du côté de mon service info s'ils ne peuvent pas retrouvé ce code source afin d'y ajouter ma touche personelle...
    Le problème, c'est que des routines d'accès serveur comme TSRqParm, y'en a des centaines, alors....


    Merci quand même de votre coup de main!

  14. #14
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Il vaut mieux lancer ça dans un autre processus.

  15. #15
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    Citation Envoyé par Laurent Gomila
    Ceci dit d'autres bibliothèques le permettent. Ne me demande pas lesquelles, mais en tout cas les APIs bas niveau (Win32, pthreads) permettent de le faire. Par contre ce ne sera pas toujours très propre, par exemple sous Windows la fonction TerminateThread ne garantit pas que toutes les ressources allouées par le thread seront libérées.
    En effet, tu peux voir ces liens issus de la FAQ Visual C++:
    - Comment créer un thread de travail ?
    - Comment arrêter un thread de travail ?

    Concernant la fonction TerminateThread(), en principe on n'a jamais besoin de l'utiliser si on s'y prends bien!

Discussions similaires

  1. Comment lancer une fonction à une date donnée
    Par ideal dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 05/02/2006, 12h52
  2. Réponses: 9
    Dernier message: 14/12/2005, 21h05
  3. [Onload] Lancer une fonction au chargement de la page ??
    Par Kylen dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 12/06/2005, 18h36
  4. [PHP-JS] comment lancer une fonction javascript a partir de php
    Par amika dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 06/06/2005, 19h23
  5. Comment lancer une fonction
    Par Elois dans le forum PostgreSQL
    Réponses: 7
    Dernier message: 21/04/2004, 19h10

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