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

Threads & Processus C++ Discussion :

[MT] problème de thread windows


Sujet :

Threads & Processus C++

  1. #1
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut [MT] problème de thread windows
    Bonjour.
    J'ai un prob avec les thread windows.
    Le but est de lancer un traitement sur un objet dans une thread, et d'avoir une tempo qui va détruire la thread si le traitement n'est toujours pas fini au bout d'un certain temps



    fonction appliqué par la thread

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    DWORD WINAPI fonction_thread( LPVOID param) { 
    MaClass* pMaClass = reinterpret_cast<MaClass*> param;   pMaClass->Debut();
    pMaClass->f2();
    pMaClass->f3();
    pMaClass->Fin();
     
    return 0;
    }



    et dans une fonction de MaClass


    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    int MaClass::TraitementThread() { 
    . 
    . 
    . 
    DWORD        dwThreadId    = 0;
     
      HANDLE handle        = CreateThread( NULL, 0,(LPTHREAD_START_ROUTINE) fonction_thread, (LPVOID) this , 0, &dwThreadId);
    //fonction qui va attendre et terminer la thread si elle ne se fini pas au bout d'un certain temps     
    DWORD dwWaitResult    = WaitForSingleObject(handle,10000); 
    . 
    .   
    .
    }

    Mon problème est qu'une des fonctions ne fonctionne pas si elle est appeler par la thread.
    Je suis obligé de l'appeler aprés l'execution de la thread.
    Je ne voit pas trop ou est le problème...
    es parce que je passe "this" en paramètre de ma thread?
    es un problème de synchronisation entre la thread principale et l'autre?
    Comment résoudre ce problème?
    étant le seul endroit ou j'ai une thread je cherche une méthode très simple... (peut être un mutex)

  2. #2
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Salut,

    qu'entends-tu par "elle ne marche pas" ?
    Avec un debugger, reçois-tu correctement le pointeur vers this dans la fonction_thread ?
    //fonction qui va attendre et terminer la thread si elle ne se fini pas au bout d'un certain temps
    Ta fonction principale n'arrête-t-elle pas le thread trop tôt ?

  3. #3
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par NiamorH Voir le message
    Avec un debugger, reçois-tu correctement le pointeur vers this dans la fonction_thread ?

    Ta fonction principale n'arrête-t-elle pas le thread trop tôt ?
    oui et non

    Citation Envoyé par NiamorH Voir le message
    qu'entends-tu par "elle ne marche pas" ?
    ... elle se bloque.. En faite MaClass utilise une dll(je n'ai pas les source bien sur) pour communiquer avec un appareil photo. Je ne sais pas trop si un thread est créé dans cette dll.
    En gros :
    -avant le thread, la connection et l'initialisation de l'appareil photo marche.
    -dans le thread, prise et récupération de la photo ok

    et aprés ces le drame... L'appel a la déconnections bloque le thread. Si j'appel la déconnections aprés, tout se passe bien.
    C'est pour cela que je me demandé si le pseudocode que j'ai donné est correcte, ou non.
    Je ne vois pas pourquoi une partie des fonction de la dll marche dans dans le thread créé et pas d'autre...
    En faite j'ai peur que le bout de code est faux et marche par chance...

  4. #4
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Si tu as ouvert la connexion dans le thread principal et que la déconnexion depuis un thread secondaire pose problème, je te conseille d'essayer de la faire dans le principal.
    Poste un message avec un ID utilisateur depuis le thread secondaire vers le thread principal et coupe la connexion dans celui-ci.
    Tu peux t'inspirer de ce sujet : http://www.developpez.net/forums/sho...hlight=wm_user

    Ou si tu peux, fait la connec depuis le secondaire.

    EDIT : dis moi, ta fonction d'attente sensée arrêter le thread secondaire, elle fait poireauter le thread principal qui reste bloqué ? tu pourais peut être plutôt utiliser un timer ?

  5. #5
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par NiamorH Voir le message
    Si tu as ouvert la connexion dans le thread principal et que la déconnexion depuis un thread secondaire pose problème, je te conseille d'essayer de la faire dans le principal.
    Comme cela ça marche.

    Citation Envoyé par NiamorH Voir le message
    Poste un message avec un ID utilisateur depuis le thread secondaire vers le thread principal et coupe la connexion dans celui-ci.
    Tu peux t'inspirer de ce sujet : http://www.developpez.net/forums/sho...hlight=wm_user
    euh je vais regarder tous cela demain. merci.



    Citation Envoyé par NiamorH Voir le message
    dis moi, ta fonction d'attente sensée arrêter le thread secondaire, elle fait poireauter le thread principal qui reste bloqué ? tu pourais peut être plutôt utiliser un timer ?
    oui, en faite cette fonctions s'arrete dans deux cas :
    - la thread as fini, tout est ok
    - temps dépassé, erreur


    Juste Pour savoir, le bout de pseudo code est correcte ou non??
    En faite je ne m'y connait pas trop en thread.
    J'ai peur que la connection/deconnection hors de la thread et la prise de photo dans la thread, marche pas chance.... Genre ca semble marcher et puis un jour ca marchera plus

  6. #6
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    C'est difficile de répondre, c'est un peu au cas par cas et je ne sais pas comment ta DLL est sensée fonctionner. Y a-t-il une doc de dispo ? Le mieux serait effectivement de rassembler la connexion, la récup d'image et la déco dans le thread 2.

    Y avait-il une raison particulière pour que tu ais placé la connexion dans le thread appellant en prime abord ? Et pourquoi faire deux threads ? La récupération de l'image est-elle longue ?

    En gardant deux threads, je ferrais comme ça :

    --> Thread principal IHM

    Sur click du bouton download :
    1--> Thread secondaire (connexion, récupération des images, notification au thread principal de la progression, déconnexion, notification de fin de tâche).
    2--> Mise en place d'un timer en paralelle qui détecte un deadlock et ferme alors le thread bloqué.

  7. #7
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par NiamorH Voir le message
    C'est difficile de répondre, c'est un peu au cas par cas et je ne sais pas comment ta DLL est sensée fonctionner. Y a-t-il une doc de dispo ? Le mieux serait effectivement de rassembler la connexion, la récup d'image et la déco dans le thread 2.

    Y avait-il une raison particulière pour que tu ais placé la connexion dans le thread appellant en prime abord ? Et pourquoi faire deux threads ? La récupération de l'image est-elle longue ?

    En gardant deux threads, je ferrais comme ça :

    --> Thread principal IHM

    Sur click du bouton download :
    1--> Thread secondaire (connexion, récupération des images, notification au thread principal de la progression, déconnexion, notification de fin de tâche).
    2--> Mise en place d'un timer en paralelle qui détecte un deadlock et ferme alors le thread bloqué.
    C'est plus compliqué que cela. Pour être précis, c'est un driver twain C++. Malheureusement les données sur l'acquisition sont repartie entre divers message TWAIN. Au départ, la thread faisait tout et il n'y avait pas(presque sauf pour un singleton pour faire des LOG) de problème. Malheuresement, les info sur l'acquisition sont aussi utilisé ailleur. On as donc besoin de la class qui fait la capture hors de la thread.
    Le but de la thread est uniquement de débloqué le driver et générer une erreur si la dll est bloqué pour diverse raison (appreil c'est eteind, erreur transfert usb, ...)

Discussions similaires

  1. Réponses: 4
    Dernier message: 02/10/2009, 09h23
  2. Threads windows this est null dans le constructeur
    Par ghalaax dans le forum Visual C++
    Réponses: 1
    Dernier message: 12/12/2006, 16h57
  3. Réponses: 4
    Dernier message: 03/07/2006, 18h13
  4. [thread + windows]
    Par titiyo dans le forum Langage
    Réponses: 4
    Dernier message: 11/01/2006, 11h13
  5. Gestion des message windows dans les threads
    Par billyboy dans le forum Windows
    Réponses: 5
    Dernier message: 06/10/2003, 17h25

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