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 :

[Threads] Sortir d'une fonction bloquante


Sujet :

MFC

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 88
    Par défaut [Threads] Sortir d'une fonction bloquante
    Bonjour.

    J'ai lu la plupart des topics concernant les threads, mais je n'ai pas trouvé la fonctionnalité que je recherche. En gros, j'ai une fonction qui peut être bloquante. Je voulais savoir comment faire pour en sortir avant la fin de son exécution. Je pensais utiliser WaitForSingleObject avec un évèneemnt qui serait positionné à la fin de l'exécution de ladite fonction, mais je ne pense pas que ça marche :
    Thread 1 :
    - initialisation de l'évènement
    - création du thread 2
    - attente de l'évènement temporisé.
    - fin du thread 2

    Thread 2:
    - appel de la fonction bloquante
    - signalement de l'évènement
    Le problème c'est que si la tempo du 1 expire, il va vouloir terminer l'autre thread. Cet autre thread étant bloqué, j'aimerai savoir ce qu'il se passera... Il faudra qu'il attende la fin de l'exécution de la fonction pour pouvoir arrêter le thread, non ?

    Donc, en résumé, comment fait-on pour sortir d'une fonction bloquante ?

    Merci d'avance,
    Joe.

  2. #2
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Il faudrait peut etre dans ce cas utiliser une fonction non bloquante. WaitForSingle_MultipleObject peut etre non bloquante. Il s'agit du dernier parametre qui precise la durée je crois.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 88
    Par défaut
    Non, ce n'est pas ce que j'ai voulu dire.
    La fonction bloquante que j'utilise est une fonction de communication avec un lecteur de carte à puce. Normalement, elle n'est pas bloquante mais j'ai déjà rencontré quelques problèmes avec. C'est pourquoi, dans le cas où elle se bloque, j'aimerais pouvoir en sortir en stoppant son exécution par un autre thread.

  4. #4
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Il faudrait tuer ton thread alors. Une fois bloqué sur une fonction tu ne peux qu'attendre qu'elle s'execute.

  5. #5
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Les fonctions de manipulation de thread :

    http://msdn.microsoft.com/library/de..._functions.asp

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 88
    Par défaut
    Ok, merci. Je vais regarder ça et voir ce que je peux faire avec. Je savais que l'on pouvait terminer un thread mais je voulais savoir si un thread bloqué pouvait aussi se terminer (et comment). Je vais essayer et on verra après .

  7. #7
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Ok, merci. Je vais regarder ça et voir ce que je peux faire avec. Je savais que l'on pouvait terminer un thread mais je voulais savoir si un thread bloqué pouvait aussi se terminer (et comment). Je vais essayer et on verra après
    Un thread bloqué sur un appel de fonction reste bloqué jusqu'a ce qu'il termine d'executer la fonction.

    Si il est bloqué sur un objet du noyau ( semaphore,mutex,event...) c'est different on peut le debloquer.

    Il faudrait plutot que la fonction qui vient lire sur la carte a puce prévoit un parametre qui correspondrait a un temps maximum de blocage.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 88
    Par défaut
    Hé hé ce serait bien, ça ! Ca m'oterait une épine du pied !... En fait j'utilise une librairie qui interface l'API SmartCard de Windows. Cette librairie ne fait pas d'opérations bloquante. Donc le problème pourrais venir de l'API Windows. J'ai regardé dans la doc, ils ne précisent pas si leurs fonctions peuvent être bloquantes, ce qui devrait quand même être un minimum lorsqu'on développe quelque chose qui communique avec un périphérique, non ?
    Jusqu'à présent j'utilisais _beginthreadex. Je crois que je vais me mettre à CreateThread. Pourquoi y a-t-il plusieurs moyens de créer des threads ? .

    Merci encore.
    @+
    Joe.

  9. #9
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Par défaut
    beginthreadex_ : à utiliser si tu fais des appels de fonctions aux Appi du runtime C (exple : strcpy, strcat, etc .....) dans ton thread.
    Note que beginthreadex_ utilise CreateThread en interne. En plus il initialise des variables dont auraient besoin certaines fonction du runtime C pour ton thread.

    CreateThread crée le Thread. Fait partie de Win32.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 88
    Par défaut
    Oui mais ce n'est pas intéressant car je ne peux pas manipuler le thread créé. Est ce que je ne peux pas utiliser la STL non plus si j'utilise CreateThread ? Ca me semble bizarre qu'un runtime ne soit pas accessible... Des précisions ?

  11. #11
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Par défaut
    Comment ça tu ne peut pas manipuler le Thread créé ?


    Bien sur que le C-Runtime reste accessible. Mais il y a des risques de blocage sur certaines fonctions du C-Runtime qui ont besoin d'initialisation au niveau du TLS (Thread Local storage) qui est faite par beginthread ou beginthreadex_

    Citation Envoyé par MSDN
    Avertissement La bibliothèque multithread LIBCMT.LIB comprend les fonctions _beginthread et _endthread. La fonction _beginthread effectue l'initialisation sans laquelle un grand nombre de fonctions d'exécution du C échoueront. Vous devez utiliser _beginthread à la place de CreateThread dans les programmes C créés à l'aide de la bibliothèque LIBCMT.LIB si vous envisagez d'appeler des fonctions d'exécution du C.
    si tu veux un exemple, crée un thread avec CreateThread, et utilise la fonction strcat de C-Runtime sur la même variable plusieurs fois à l'intérieur ....

    Sinon pour que beginthreadex_ soit plus "convivial" j'ai piqué une ptite macro à J. Richter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // Crée un thread avec la fonction _beginthreadex du C runtime
    typedef unsigned (__stdcall *PTHREAD_START) (void *);
    #define BEGINTHREADEX(psa, cbStack, pfnStartAddr, pvParam, fdwCreate, pdwThreadId)	\
           ((HANDLE)_beginthreadex((void *) (psa),										\
    							   (unsigned) (cbStack),				                \
    							   (PTHREAD_START) (pfnStartAddr),			            \
    							   (void *)        (pvParam),							\
    							   (unsigned)      (fdwCreate),							\
    							   (unsigned *)    (pdwThreadId)))

  12. #12
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    si tu veux un exemple, crée un thread avec CreateThread, et utilise la fonction strcat de la STL sur la même variable plusieurs fois à l'intérieur ....
    Depuis quand strcat fais partie de la STL ?
    strcat est une fonction du C , la STL etant la réunissement de patron de class

  13. #13
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Par défaut
    Tu as raison hegros...
    C'est un abus de langage de ma part.
    Je veux bien sur parler du C Runtime de MS.
    Je corrige donc ...

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 88
    Par défaut
    Citation Envoyé par abelman
    Comment ça tu ne peut pas manipuler le Thread créé ?
    Et bien je n'ai pas trouvé de _endthread(unsigned long threadID) ou équivalent... Merci pour tes précisions concernant CreateThread, je ne vais donc pas l'utiliser. Mais j'aimerais savoir comment terminer un thread que j'ai lancé avec _beginthread.

    Merci à vous deux pour vos réponses.
    Joe.

    PS : abelman> je ne vois pas l'avantage de ta macro. A moins que ce ne soit juste pour écrire BEGINTHREADEX au lieu de _beginthreadex... Qu'apporte-t-elle ?

  15. #15
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Par défaut
    La macro c'est juste pour ne pas écrire les cast à chaque fois.
    Mais cela dit on s'en passe très bien.

    Sinon c'est beginthreadex_ et endthreadex_. enthread n'a pas de paramètres

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 88
    Par défaut
    le paramètre de _endtreadex est la valeur qui doit être retournée, pas l'ID du thread. Euh sinon, tu castes à chaque fois que tu appelles une fonction ?

  17. #17
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Par défaut
    Arf mais oui où ai je la tête.
    Pour kill le thread. api Win32 TerminateThread

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 88
    Par défaut
    TerminateThread n'est censé marcher que pour CreateThread, non ?
    Ca serait comme faire un delete après avoir fait un malloc, non ?
    C'est pas clair tout ça...

  19. #19
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Par défaut
    ça marche pour les deux.

    de toutes manières si ton thread est bloqué sur une fonction dont tu n'a pas la main et que tu veux absolument le tuer tu n'as pas le choix. c'est un kill, donc ce n'est pas propre.

  20. #20
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 88
    Par défaut
    Mouais, c'est pas très propre leur façon de faire, là.
    En fait la fonction qui peut bloquer fait partie de l'API SmartCard pour Windows. En fait c'était juste au cas où. Donc le côté pas propre si il y en a un, viendrait plutôt du côté de l'API. Bah je vais leur faire confiance et présumer que si rien n'est précisé dans MSDN au sujet des timeout et de la gestion des interruptions avec le lecteur de carte, c'est parce qu'il n'y a pas de blocages, et qu'il ne faut pas s'en soucier.
    Le kill de thread aurait été provoqué par l'utilisateur qui, s'il remarque qu'une instruction met trop de temps à être délivrée à la carte, peut stopper l'exécution d'une liste d'instructions envoyées à un lecteur.
    En tout cas merci pour ces précisions au sujet des threads parce que ce n'est vraiment pas clair dans la MSDN (enfin selon moi...)

    Bonne journée,
    Joe

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

Discussions similaires

  1. Sortir d'une fonction.
    Par intelcore dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 20/05/2007, 16h21
  2. Comment sortir d'une fonction?
    Par Kobe70 dans le forum Langage
    Réponses: 3
    Dernier message: 10/05/2007, 13h44
  3. [AJAX] Sortir d'une fonction
    Par zooffy dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 12/01/2007, 14h07
  4. Comment sortir d'une fonction ?
    Par serialkilled dans le forum Langage
    Réponses: 3
    Dernier message: 16/12/2006, 12h30
  5. Réponses: 1
    Dernier message: 09/08/2006, 16h04

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