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

Multithreading Discussion :

[QThread] QProcess et QSemaphore


Sujet :

Multithreading

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 37
    Par défaut [QThread] QProcess et QSemaphore
    Bonjour,
    Je développe actuellement une application multi-process, mais ces processus ne partagent pas tous des ressources, 2 processus écrivent tous les deux sur la sortie standart, et 2 autres accèdent à la base de données.
    Par exemple mon application principale permet d'afficher des pdf, d'éxécuter un dump de la base...
    Ma question est suis-je obligé de mettre en place un système de sémaphore pour tous mes QProcess, ou est-ce que je ne dois les utiliser que pour les 2 processus fils qui ecrivent sur la sortie standart. Voire est-ce qu'un simple système(un booléen) qui empêcherait à un de ces 2 processus de s'exécuter pendant que l'autre fonctionne n'est pas suffisant.
    Merci

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Va falloir mettre en place un tel système pour les process qui en ont besoin, mais QSemaphore n'est pas ce qu'il te faut. En effet, les sémaphores et autres mutex, c'est normalement pour le sthreads et non les processus.

  3. #3
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par slymira Voir le message
    Bonjour,
    Je développe actuellement une application multi-process
    Ne confonds-tu pas multi-process et multi-thread? Combien d'exe as-tu? Utilises-tu QThread?

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 37
    Par défaut
    Non je ne confonds pas, mon application est bien multi-process et j'utilise bien QProcess.
    Elle est composée d'un exe principal, plus 3 autres qui sont sensés fonctionner en permanence.
    Chacun de ces processus peuvent executer plusieurs autres petits "outils" tel que le lancement de pdf, d'un dump de la base et d'autres exe qui communiquent par la sortie standart.
    Il faudrait que les processus qui communiquent par la sortie standart ne soient pas perturbés par d'autres process en cours, donc ma question était est-ce que je dois pour cela mettre en place un système de sémaphore.
    Et si oui est-ce que je dois gérer uniquement les processus qui communiquent par la sortie standart ou également tous les autres "petits outils".
    Merci

  5. #5
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Les processus qui partagent une rssource soivent être protégés, c'est tout

  6. #6
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par slymira Voir le message
    Il faudrait que les processus qui communiquent par la sortie standart ne soient pas perturbés par d'autres process en cours
    Quel genre de perturbation?


    Citation Envoyé par slymira Voir le message
    ma question était est-ce que je dois pour cela mettre en place un système de sémaphore.
    Et si oui est-ce que je dois gérer uniquement les processus qui communiquent par la sortie standart ou également tous les autres "petits outils".
    Les sémaphores, tels qu'ils sont implémentés par Qt, ne semblent pas partageables entre plusieurs process. Et puis un semaphore tout seul, hum, faudrait préciser tes besoins (scénario).
    Fait des recherches du coté de l'IPC. Qt propose D-BUS, mais je ne sais pas trop ce que ca vaut sous Windows.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 37
    Par défaut
    En fait je travaille sur une application existante sur laquelle je peux difficilement modifier l'architecture.
    Actuellement l'application dispose d'un code de calcul fortran, qui est interfacé en C.
    Mon application et le code de calcul communique via la sortie standart avec la lecture et l'ecriture de paramètre au cours du calcul. La fonction canReadLineStdout() de QProcess est utilisée.
    Seulement de temps en temps il semble que l'on perd des informations. Comme il existe 3 codes de calculs différents(3 exécutables donc) j'étudie la possibilité d'interférence entre ces 3 codes de calculs voire je me demandais si d'autres processus en cours d'exécution ne pouvait pas aussi être responsable de ces problèmes.
    Merci

  8. #8
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Hum... Je ne crois pas que les exe lancés par QProcess partagent les memes flux standards. Normalement chaque process a son propre flux d'entrée/sortie. L'erreur doit venir d'ailleurs
    Comment lis-tu la sortie d'un process lancé?

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 37
    Par défaut
    Côté code de calcul en c, de simple scanf/printf sont réalisés.
    Côté application, il est utilisé writeToStdin() et readLineStdout().
    Je précise que le phénomène de pertes d'informations est rare.

  10. #10
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Qt3 je présume... Peut etre est-ce des readLineStderr() qui manquent?
    Le truc c'est qu'il faudrait arriver a trouver un scénario répétable qui reproduise le bug...

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 37
    Par défaut
    Bonjour,
    bon après une longue pèriode d'investigation j'ai pas mal avancé sur le sujet.
    Il était auparavant utilisé une reception ligne à ligne des résultats écrits sur la sortie standard (on attendait une ligne avec canReadLineStdout, on la lisait en on bouclait jusqu'à la reception de tous les paramètres).
    Cette méthode fonctionnait correctement avec les machines à processeur unique, seulement nous sommes récemment passés a des PC double-coeur et cette synchro ne semble plus fonctionner.(on manque certaines lignes ou on lit 2 fois la même ligne)
    J'ai tenté d'utiliser le signal ReadyReadStdout pour lire les résultats ligne par ligne, il semble qu'on ne recoivent pas tous les signaux.
    J'ai alors tenté de lire les résultats par "paquet" en utilisant toujours le signal ReadyReadStdout mais en utilisant la fonction readStdout.
    Cela semble fonctionner la plus part du temps correctement mais il arrive encore que le signal ReadyReadStdout ne soit pas recu.
    Et là je sèche, est-ce que cette méthode de synchronisation entre process est mauvaise?
    Est-ce qu'il faut obligatoirement exécuter le QProcess sur le même processeur et si oui comment?
    Pourquoi un signal ReadyReadStdout n'est-il pas emis à chaque ligne écrite sur la sortie standard?

    Merci de votre aide

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 37
    Par défaut
    Je pense avoir résolu mon problème.
    Apparemment lorsque des printf sont réalisés successivement, QProcess ne détecte pas toujours plusieurs signaux readyReadStdout, même lorsque qu'on fait fflush(stdout) entre chaque printf.
    J'ai donc fait un unique fflush à la fin de l'écriture de tous les paramètres que je lis en une seule fois à l'aide de readStdout().
    Je ne comprends quand même pas pourquoi QProcess ne réagit pas toujours de la même manière lors des printf sur la sortie standard.
    Est-ce que ce n'est pas fait pour faire de la lecture ligne par ligne sur la sortie standard???
    Est-ce que la méthode que j'emploie maintenant va toujours fonctionner ou est-ce que lorsque le PC sera ralenti par d'autres applications il se peut que je perde de nouveau des informations car QProcess détectera alors plusieurs signaux readyReadStdout?

Discussions similaires

  1. [PySide] QProcess ou QThread pour ce cas ?
    Par Einenlum dans le forum PyQt
    Réponses: 10
    Dernier message: 30/05/2014, 15h20
  2. [QThread] ne marche pas
    Par alpha_one_x86 dans le forum Multithreading
    Réponses: 11
    Dernier message: 23/11/2007, 09h13
  3. [Thread] QThread et QSocket
    Par G3G3 dans le forum Multithreading
    Réponses: 7
    Dernier message: 30/10/2007, 20h25
  4. Réponses: 8
    Dernier message: 21/12/2006, 21h03

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