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

MFC Discussion :

Probleme avec la mise en place de thread


Sujet :

MFC

Vue hybride

jcloupgarou Probleme avec la mise en... 27/02/2012, 11h59
mala92 Sur le principe ça ne paraît... 27/02/2012, 14h00
bacelar Ce genre de problème est très... 27/02/2012, 14h21
jcloupgarou Excuse moi pour une précision... 27/02/2012, 14h22
jcloupgarou Est ce que le service Windows... 27/02/2012, 14h25
jcloupgarou Cela signifie que il me faut... 27/02/2012, 15h25
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 99
    Par défaut Probleme avec la mise en place de thread
    Bonjour, je développe une application avec MFC (VS8) pour du calcul scientifique 3D (physique des particules). Les calculs sont longs, voir très longs (des dizaines de jours). Aujourd'hui, le schéma de fonctionnement suivant est utilisé pour chaque calcul :

    - CBoiteDeDialogueCalculA de CDialog (avec champs d'initialisation, progressbar, ...)
    - CCalculA qui effectue le calcul proprement dit (avec une ribanbelle de classes appelées) et interagit avec la progressbar.

    - dans CMainFrame, lié à un menu :
    - Déclaration de CboiteDeDialogueCalculA
    - DoModal() et la boite dialogue prend le relais

    => Le calcul freezera rapidement la boite de dialogue, voire toute l'appli !!!

    La solution est d'ajouter du multi-threading ;o)

    Ok, je lance désormais les calculs comme des nouveaux thread, cad :
    - dans CboiteDeDialogueCalculA, je lance la fonction de calcul :
    AfxBeginThread( MaFonctionDeCalcul, CboiteDeDialogueCalculA*)

    => Le calcul se lance, tout commence bien, la progressBar, les textes informatifs de la boite de dialogue et, de facon aléatoire, ca plante sur le DoModal lancé dans le CMainFrame et à des endroits différents dans le code du DoModal ???
    Je suis un peu paumé avec les possibilités et la manière de s'y prendre pour le multi-threading, c'est ma première fois... J'ai essayé en ouvrant ma boite de dialogue en Create() pour que le GUI principal reste accessible, mais dans ce cas ce sont les fonctions d'auto-update de l'interface (OnUpdateEditCut, OnUpdateEditPaste,...) qui plantent...

    Merci de partager votre expérience sur cet épineux problème !
    Jc.

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2011
    Messages
    1 255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 255
    Par défaut
    Sur le principe ça ne paraît pas déconnant !!!

    En général, plantage aléatoire à différents moments = jardinage.

    Vérifie que les données de ton thread ne débordent pas.

  3. #3
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 463
    Par défaut
    Ce genre de problème est très courant pour les débutants.

    Si le programme vous semble bon, pas de connerie comme des pointeurs utilisées n'importe comment, la cas le plus fréquent est un problème de mise à jours concurrente de données dans les contrôles Windows.

    Les contrôles Windows ne sont pas threadsafe. S'ils sont accédés par plusieurs threads cela provoque des plantages "aléatoires" pour le néophyte.

    Vérifiez que vous ne modifiez le contenu affiché par les contrôles que depuis le thread qui les a créé.

    Pour des calcules de plusieurs jours, je n'aurais pas fait du multithreading, j'aurais isolé ces traitement long dans un autre processus, comme dans un Service Windows qui peut tourner sans personne de connecté et dispose d'un mécanisme de reprise sur erreur intégré au système. En plus, cela serait étanche et donc il n'y aurait pas de problème d'accès concurrent aux contrôles Windows. Il faudra juste utiliser des IPC pour communiquer avec le Service Windows.

  4. #4
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 99
    Par défaut
    Excuse moi pour une précision sur le vocabulaire :
    - Jardinage ?
    - les données ne débordent pas ?

    Merci pour ton aide

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 99
    Par défaut
    Est ce que le service Windows que tu décrits pourrait etre à meme de mettre a jour l'affichage 3D des trajectoires calculées au fur et à mesure de l'avancement de la simulation, c'est ainsi que cela fonctionne aujourd'hui ?

    Je déduis que je dois effectivement faire des accés concurrents à des espaces mémoires, l'objet instancié gérant le calcul (Thread) utilisant des propriétés du doc et du mainframe qui sont aussi utilisés par l'affichage...

    Aie !je pensais que Windows se démerdait comme un grand avec cela...

  6. #6
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 99
    Par défaut
    Cela signifie que il me faut dupliquer toutes les données utilisées en meme temps pour la partie affichage et la partie calcul (modele 3D avec géométrie, propriétés physiques, d'affichage) : c'est énorme ! Il s'agit de modele 3D de satellites ou d'engin spatiaux en général, détaillés jusqu'aux composants electroniques.
    N'y a-t-il pas un procédé pour partager ces données sans les dupliquer en mémoire ? Si c'est effectivement ce qu'il faut faire...
    MErci

  7. #7
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2011
    Messages
    1 255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 255
    Par défaut
    Jardinage : ta partie calcul va taper dans la mémoire de ta partie affichage sans que tu le désires.
    Citation Envoyé par jcloupgarou Voir le message
    N'y a-t-il pas un procédé pour partager ces données sans les dupliquer en mémoire ? Si c'est effectivement ce qu'il faut faire...
    MErci
    Surtout pas dupliquer !!!!!
    tu peux ne pas dupliquer, par contre, tes threads pointent sur la même zone mémoire, donc il ne faut pas qu'ils y touchent (écriture/lecture) en même temps. Tu dois mettre en place une section critique.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. probleme avec la mise à jour
    Par j_esti dans le forum Hibernate
    Réponses: 6
    Dernier message: 24/06/2008, 14h16
  2. probleme avec la mise en veille prolongée
    Par ABN84 dans le forum Windows XP
    Réponses: 7
    Dernier message: 25/11/2007, 23h45
  3. [openSuse10.3] problem avec les mises a jour
    Par wodel dans le forum SUSE
    Réponses: 2
    Dernier message: 20/11/2007, 10h06
  4. Réponses: 8
    Dernier message: 09/09/2007, 12h52
  5. Réponses: 1
    Dernier message: 30/03/2007, 16h45

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