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

WinDev Discussion :

Synchronisation de threads avec signaux, comportement bizarre


Sujet :

WinDev

  1. #1
    Membre averti Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 710
    Points : 444
    Points
    444
    Par défaut Synchronisation de threads avec signaux, comportement bizarre
    Bonjour,

    encore une fois je m'en remets à vous pour analyser un comportement que je n'arrive pas à expliquer.

    Je vous décris le contexte :

    soit une fenêtre FI_CHIFFRE_AFFAIRE qui me fait un graphe représentant le chiffre d'affaire réalisable sur une période compte tenu du carnet de commande.
    ainsi qu'une procédure refresh qui exécute 2 threads, l'un qui récolte les données nécessaires au graphe (temps d'interrogation peut prendre quelques secondes) et l'autre qui va dessiner le graphe quand le premier thread sera terminé :
    je veux mettre en standby mon second thread tant que le premier n'est pas terminé, mais la pause ne doit pas avoir lieu dans le thread principal pour ne pas le bloquer
    je décide d'utiliser un signal dont le nom est une variable globale de ma fenêtre, égal à "dessine_"+donneIdentifiant(), cette même fenêtre interne pouvant être dupliqué un nombre de fois inconnu, le nom du signal doit être unique.
    voici ce que j'essaies de faire actuellement :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    PROCEDURE refresh()
     
    SignalDétruit(nomSignal)
    SignalCrée(nomSignal, signalAutomatique, signalFermé)
     
    // Exécution du thread de query
    ThreadArrête("ThreadQuery")
    ThreadExécute("ThreadQuery", threadNormal, "query")
     
    // Exécution du thread de dessin
    ThreadArrête("ThreadDessine")
    ThreadExécute("ThreadDessine", threadNormal, "dessine")

    au début de dessine() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SignalAttend(nomSignal)
    Trace("signal reçu")
    //suite des instructions de dessin
    //...
    et à la fin de query() je lance un SignalModifie(nomSignal, signalOuvert)

    Pourtant, quand je trace l'évolution des 2 procédures threadées, j'ai immédiatement le "signal reçu", alors que la procédure query () a à peine commencé...

    Du coup j'ai un plantage de ma procédure de dessin parce qu'elle s'appuie sur des données qui ne sont pas encore présentes !!

    Est-ce que je m'y prends mal ?

    Merci
    'Diviser chacune des difficultés en autant de parcelles qu’il se pourrait et qu’il serait requis pour les mieux résoudre', René Descartes

    => Maya GPAO

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Pourquoi ne pas utiliser une sémaphore ?

    Tatayo.

  3. #3
    Membre averti Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 710
    Points : 444
    Points
    444
    Par défaut
    Bonjour,
    j'ai mis la charrue avant les bœufs en postant sans me renseigner avant
    là je lis quelques posts qui traitent d'à peu près le même sujet, et effectivement le concept de sémaphore est resorti, je pense que c'est aussi ce qu'on appelle mutex ?
    je dois voir comment le mettre en pratique
    éventuellement un exemple serait le bienvenu
    'Diviser chacune des difficultés en autant de parcelles qu’il se pourrait et qu’il serait requis pour les mieux résoudre', René Descartes

    => Maya GPAO

  4. #4
    Membre averti Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 710
    Points : 444
    Points
    444
    Par défaut
    en fait je ne sais pas si c'est vraiment ce qu'il me faut

    je ne souhaite pas réellement protéger un bout de code de manière à ce qu'il ne puisse être exécuté que par un thread à la fois (= section critique = sémaphore ou mutex)

    je cherche plutôt à mettre en attente un thread B, lequel sera débloqué à la fin d'un thread A, sachant que les deux threads A et B sont créés l'un après l'autre par le thread principal

    je me demande si un signal peut être transmis entre deux thread secondaires, dans l'aide on dirait que c'est toujours le thread principal qui envoie des signaux aux threads secondaires....
    'Diviser chacune des difficultés en autant de parcelles qu’il se pourrait et qu’il serait requis pour les mieux résoudre', René Descartes

    => Maya GPAO

  5. #5
    Membre averti Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 710
    Points : 444
    Points
    444
    Par défaut
    Ok, alors un threadpause(100) au début du thread B a réglé le problème

    Bon je me retrouve quand même confronté à ce fichu problème de graphe qui ne peut être dessiné correctement quand les instructions sont dans un thread, j'avais oublié ça

    Du coup je suis contraint d'exécuter ma procédure dessine() dans le thread principal, mais comment attendre la fin du thread de collecte de données pour exécuter dessine() sans que ce soit bloquant dans le thread principal

    j'ai comme l'impression que le comportement que je recherche nécessite d'utiliser les threads, mais le contexte particulier de mon problème (dessiner un graphe) fait que ça ne peut pas être dans un thread

    EDIT : Est-ce que l'utilisation de postmessage ou d'événement permet de se détacher du contexte threadé ? parce que ce serait la solution pour moi de déclencher un événement dans le thread principal sur lequel je déclenche dessine()
    'Diviser chacune des difficultés en autant de parcelles qu’il se pourrait et qu’il serait requis pour les mieux résoudre', René Descartes

    => Maya GPAO

  6. #6
    Membre averti Avatar de droliprane
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2005
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2005
    Messages : 710
    Points : 444
    Points
    444
    Par défaut
    Formidable, postmessage fonctionne parfaitement pour simuler un évenement sur un bouton par exemple, via l'api Windows

    c'est mon thread secondaire qui lance un PostMessage(Handle(BTN_dessine),WM_LBUTTONDOWN,0,0) et le traitement dessine() qui s'exécute sur clic du bouton a bien lieu dans le contexte du thread principal

    par contre, le dit bouton doit être visible, ça ne fonctionne pas lorsqu'il est invisible, alors je dois le rendre tout petit (1x1) à moins qu'une autre technique plus propre existe...
    'Diviser chacune des difficultés en autant de parcelles qu’il se pourrait et qu’il serait requis pour les mieux résoudre', René Descartes

    => Maya GPAO

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Peut-être en le changeant de plan, même si je n'y crois pas trop.
    Sinon il doit être possible de le masquer derrière un autre champ en jouant avec l'altitude.

    Tatayo.

  8. #8
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2009
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2009
    Messages : 178
    Points : 416
    Points
    416
    Par défaut
    Bonjour,

    Postmessage vous permet d'envoyer l'événement que vous voulez, en remplaçant le WM_LBUTTONDOWN par un entier à votre convenance (enfin presque, voir du coté de WM_USER ...), vous pouvez ensuite dans votre fenêtre principale déclarer un événement avec ce code, qui exécute votre procédure.

    Le dernier sujet de WdKyle illustre justement ce fonctionnement ....

Discussions similaires

  1. Réponses: 13
    Dernier message: 11/06/2015, 15h51
  2. Synchronisation des threads avec deux sémpahores
    Par pupucette dans le forum C++
    Réponses: 0
    Dernier message: 27/01/2013, 22h17
  3. Menu tooltips avec un comportement bizarre
    Par redah75 dans le forum jQuery
    Réponses: 8
    Dernier message: 30/04/2011, 04h24
  4. Synchronisation de Threads avec un systeme de signal/event
    Par Niklaos dans le forum Threads & Processus
    Réponses: 23
    Dernier message: 03/01/2010, 19h01
  5. Bouton personnalisé avec un comportement bizarre
    Par laedit dans le forum Windows Presentation Foundation
    Réponses: 1
    Dernier message: 22/04/2009, 04h01

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