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

Windows Discussion :

ReadFile Asynchrone avec OVERLAPPED


Sujet :

Windows

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2007
    Messages : 45
    Points : 17
    Points
    17
    Par défaut ReadFile Asynchrone avec OVERLAPPED
    Bonjours, je viens lire les donnée sur un port USB avec un ReadFile
    et j'utilise le mode asynchrone:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    OVERLAPPED gOverlapped ;
          gOverlapped.Offset = 0;
          gOverlapped.OffsetHigh = 0;
          gOverlapped.hEvent=CreateEvent(NULL,FALSE,FALSE,NULL);
    
    
         Result = ReadFile(DeviceHandle, InputReport, Capabilities.InputReportByteLength, &BytesRead, &gOverlapped );
    Sa fonctionne quand je vais lire les donnée sur un périphérique, mais si mon périphérique ne renvois rien le programme reste bloquer dans le ReadFile, j'ai vu qu'il y avait un moyen d'utiliser Overlapped avec une sorte de timer pour pouvoir ressortir du readfille quand on es bloquer dedans mais j'ai pas compris comme sa fonctionnais!!!

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Il faut que l'ouverture ait été faite en mode Overlapped pour que ReadFile marche avec une telle structure.

    À ce moment-là, il n'y a pas de timeout, ReadFile() retourne toujours immédiatement.
    Par contre, tu peux utiliser une fonction d'attente sur l'Event, et dans celle-ci tu peux fixer un timeout.
    Si rien ne se produit dans les temps, une fois ton timeout écoulé, tu peux abandonner l'opération avec la fonction CancelIo().
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2007
    Messages : 45
    Points : 17
    Points
    17
    Par défaut
    je comprend pas très bien :

    Il faut que l'ouverture ait été faite en mode Overlapped pour que ReadFile marche avec une telle structure.

    Comen sa???

    L'ouverture de quoi?

    ps. Je suispas un epxert en c++ mais plutot un débutant!

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    L'ouverture du périphérique, celle qui t'a retourné DeviceHandle.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2007
    Messages : 45
    Points : 17
    Points
    17
    Par défaut
    je crès mon DeviceHandle comme sa:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DeviceHandle = CreateFile(detailData->DevicePath,
          GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
          (LPSECURITY_ATTRIBUTES) NULL, OPEN_EXISTING, 0, NULL);
    commen je peu le faire en mode Overlapped?

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2007
    Messages : 45
    Points : 17
    Points
    17
    Par défaut
    enfaite faudrai que je le mette comme sa:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    eviceHandle = CreateFile(detailData->DevicePath,
          GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
          (LPSECURITY_ATTRIBUTES) NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
    Ouai mais maintenent quand mon périférique envois des donnée ben sa lit les bonne donnée mais quand mon périférique renvois rien ben sa lit quand meme des données !

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Comment sais-tu que "sa lit quand meme des données" ?
    As-tu attendu la fin de l'opération overlapped ?
    As-tu vérifié le compte de données lues ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2007
    Messages : 45
    Points : 17
    Points
    17
    Par défaut
    Ben car après je traite les donnée pour les afficher!!!
    Enfaîte je lit les donnée qui me parvienne d'un jostick!

    Et quand j'utilise les joystick sa me renvoi les bonne donnée et quand je touche pas le joystick sa me renvois aussi des données

    As-tu attendu la fin de l'opération overlapped ?
    As-tu vérifié le compte de données lues ?

    Ben je sais pas je fait juste :
    Result = ReadFile(DeviceHandle, InputReport, Capabilities.InputReportByteLength, &BytesRead, &gOverlapped );
    et ensuite je traite les données!

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Citation Envoyé par Médinoc
    Il faut que l'ouverture ait été faite en mode Overlapped pour que ReadFile marche avec une telle structure.

    À ce moment-là, il n'y a pas de timeout, ReadFile() retourne toujours immédiatement.
    Par contre, tu peux utiliser une fonction d'attente sur l'Event, et dans celle-ci tu peux fixer un timeout.
    Si rien ne se produit dans les temps, une fois ton timeout écoulé, tu peux abandonner l'opération avec la fonction CancelIo().
    Faut lire...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2007
    Messages : 45
    Points : 17
    Points
    17
    Par défaut
    Désoler je comprend pas bien là, enfaîte maintenant je reçois toujours les valeur donc je dois traiter les valeur que je reçois pour voir les quelle sont bonne?

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    NON.
    Ce que je dis, c'est que si tu ouvres le périphérique en overlapped, toutes les opérations dessus seront en overlapped.

    Entre autre, ça signifie que ReadFile() retourne avant d'avoir fini de lire.
    Donc, il ne faut pas toucher aux données avant d'avoir attendu l'Event avec succès.
    Et une fois la lecture finie, il faut consulter la valeur BytesRead pour savoir combien d'octets ont effectivement été lus par ReadFile().
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2007
    Messages : 45
    Points : 17
    Points
    17
    Par défaut
    MAis quel 'Event ?

  13. #13
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gOverlapped.hEvent=CreateEvent(NULL,FALSE,FALSE,NULL);
    Tu le lis, ton code, ou quoi ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2007
    Messages : 45
    Points : 17
    Points
    17
    Par défaut
    Oui mais la question étais plutot queseque tu entend par:
    avoir attendu l'Event avec succès!

    je doit tester l'event?

  15. #15
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Si tu ne sais pas te servir d'un event, ce n'est pas la peine d'essayer de jouer avec OVERLAPPED, tu n'y arriveras pas.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2007
    Messages : 45
    Points : 17
    Points
    17
    Par défaut
    Ouai mais j'ai pas le choix!!!

    J'ai fais un grand bout de mon programme!

    Mais je lisai synchrone et je dois lire asynchrone alors voila!
    C'est pour sa que je cherche commen faire!

    Ps. je joue pas, mais c'est pas grave, merci de m'avoir aider jusque là!

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2007
    Messages : 45
    Points : 17
    Points
    17
    Par défaut
    hello, voila j'ai chercher un peu!!!
    et j'ai avancé mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        while(GetLastError()==ERROR_IO_PENDING)
        {
          if (GetOverlappedResult(gOverlapped.hEvent,&gOverlapped,&BytesRead,true))
          break;
         }
    Es que je suis sur la bonne voix?
    Le problème maintenant c'est que si je renvois pas de donnée il se bloque dans le while

  18. #18
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Et si tu utilisais simplement WaitForSingleObject() pour attendre l'événement, comme indiqué dans la doc de CreateEvent() ?
    Citation Envoyé par MSDN
    Any thread of the calling process can specify the event-object handle in a call to one of the wait functions. The single-object wait functions return when the state of the specified object is signaled. The multiple-object wait functions can be instructed to return either when any one or when all of the specified objects are signaled. When a wait function returns, the waiting thread is released to continue its execution.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2007
    Messages : 45
    Points : 17
    Points
    17
    Par défaut
    ok la j'ai fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     WaitForSingleObject(gOverlapped.hEvent, 200);
    et ensuite je teste le result et bytes read:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if (Result |BytesRead )
    pour savoir si je dois faire le traitement ou pas!

    La je fais le test avec un joystick et sa marche bien pour la molette et le manche mais pas pour les bouton et même si j'augmente le temps dans el time out de WaitForSingleObject il détecte jamais les bouton!
    Même si je mais le time out à INFINITE!

    enfaîte quand j'utilise les bouton le Result et bytesread ne change pas!
    eseque c'est normal?

  20. #20
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    C'est quoi ce | ?
    Non mais qu'est-ce que tu fais ?
    Tu dois vérifier que l'opération de lecture est bien terminée, et ensuite faire le contrôle sur les octets lus.

    Je ne sais pas comment marche le Joystick, mais à mon avis il ne retourne pas qu'un seul octet, mais plusieurs, liés au temps, aux événements, etc. Tu dois donc tester la vraie valeur de BytesRead et agir en conséquence!
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Treeview asynchrone avec jQuery
    Par garthos dans le forum jQuery
    Réponses: 6
    Dernier message: 01/10/2010, 15h58
  2. Travailler en asynchrone avec un recordset ADO
    Par zoorgh dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 28/08/2008, 09h02
  3. [Débutant][|MSSQL 2000] problème avec Overlaps
    Par Spoutnik dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 14/11/2006, 10h33
  4. ReadFile Asynchronous
    Par Taron31 dans le forum Windows
    Réponses: 12
    Dernier message: 24/02/2006, 16h03
  5. Replication synchrone/asynchrone avec Oracle 8i
    Par Fraise des Bois dans le forum Oracle
    Réponses: 1
    Dernier message: 11/01/2006, 21h24

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