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 Asynchronous


Sujet :

Windows

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2006
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 31
    Par défaut ReadFile Asynchronous
    Bonjour,

    En visitant la page MSDN concernant la fonction ReadFile, j'ai lu qu'il y avait 2 "modes" de lecture, un dit "synchronous" et un second dit "asynchronous". J'aimerais avoir quelques informations à ce sujet là s'il vous plait, quoi sert le "mode asynchronous" ?

    Notamment, en ce qui concerne la vérification du EOF, on peut lire que cela diffère du "mode" de lecture, aussi je n'ai pas bien compris la méthode de vérification du EOF pour le mode asynchronous :
    An asynchronous read operation can get to the end of a file during the initiating call to ReadFile, or during subsequent asynchronous operation.

    If EOF is detected at ReadFile time for an asynchronous read operation, ReadFile returns FALSE and GetLastError returns ERROR_HANDLE_EOF.

    If EOF is detected during subsequent asynchronous operation, the call to GetOverlappedResult to obtain the results of that operation returns FALSE and GetLastError returns ERROR_HANDLE_EOF.
    J'attends de vos lumières :-)
    Merci beaucoup.

  2. #2
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Note que j'ai déplacé vers le forum Dev. Windows.

    En mode asynchronous, ReadFiel rend immédiatement la main, et ta demande de lecture est en quelque sorte mise en suspend, et traitée en parallèle. Ca marche en gros comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // appel de ReadFile
    
    // faire autre chose
    
    // attendre que le ReadFile précédent soit exécuté
    // tester le résultat du ReadFile (succès / échec)
    La remarque t'explique que la "requête" n'est pas traitée sur tu es déjà en fin de fichier, en clair, le ReadFile échoue immédiatement.

  3. #3
    Membre averti
    Inscrit en
    Février 2006
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 31
    Par défaut
    En fait, ReadFile en mode asynchronous, ce serait un peu comme un thread ?
    Ok merci.

  4. #4
    Membre émérite Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Par défaut
    C'est exactement le principe.

    L'appelant d'un ReadFile asynchrone n'est pas bloqué à attendre la complétion de l'opération.

    Mais ça suppose d'aller régulièrement "inspecter" si des données sont arrivées pour les traitées.

    ReadFile synchrone lui est bloquant pour l'appelant jusqu'à complétion de la lecture. Ce qui peu poser problème si jamais rien n'arrive à l'application.

    Pour cette raison, un ReadFile synchrone est souvent mis dans un thread.

  5. #5
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Sauf que c'est un thread kernel, et pas un thread à toi. En temps normal, quand tu fais un read, ton thread est bloqué, le noyau bosse, puis ton thread est débloqué. En mode asynchrone, ton thread n'est pas bloqué pendant que le noyau répond à sa demande.
    http://msdn.microsoft.com/library/en-us/dllproc/base/synchronization_and_overlapped_input_and_output.asp
    http://www.codeproject.com/internet/IOCompletionPort.asp

  6. #6
    Membre averti
    Inscrit en
    Février 2006
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 31
    Par défaut
    Mais ça suppose d'aller régulièrement "inspecter" si des données sont arrivées pour les traitées.
    D'où ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    OVERLAPPED gOverlapped;
    
    // Set up overlapped structure fields.
    gOverlapped.Offset     = 0; 
    gOverlapped.OffsetHigh = 0; 
    gOverlapped.hEvent     = hEvent; 
    
    // Verify that sizeof&#40;inBuffer <= nBytestoRead&#41;.
     
    // Attempt an asynchronous read operation.
    bResult = ReadFile&#40;hFile, &inBuffer, nBytesToRead, &nBytesRead, 
        &gOverlapped&#41; ; 
     
    // If there was a problem, or if the asynchronous operation 
    // is still pending. 
    if &#40;!bResult&#41; 
    &#123; 
        // Deal with the error code. 
        switch &#40;dwError = GetLastError&#40;&#41;&#41; 
        &#123; 
            case ERROR_HANDLE_EOF&#58; 
            &#123; 
                // WCode to handle the end of the file 
                // during the call to ReadFile 
     
                 
            &#125; 
     
            case ERROR_IO_PENDING&#58; 
            &#123; 
                // Asynchronous I/O is still in progress
     
                // Do something else for a while 
                GoDoSomethingElse&#40;&#41; ; 
     
                // Check on the results of the asynchronous read. 
                bResult = GetOverlappedResult&#40;hFile, &gOverlapped, 
                    &nBytesRead, FALSE&#41; ; 
     
                // If there was a problem  
                if &#40;!bResult&#41; 
                &#123; 
                    // Deal with the error code. 
                    switch &#40;dwError = GetLastError&#40;&#41;&#41; 
                    &#123; 
                        case ERROR_HANDLE_EOF&#58; 
                        &#123; 
                            // We have reached the end of
                            // the file during asynchronous
                            // operation.
                        &#125; 
     
                        // Deal with other error cases. 
                    &#125;   //end switch &#40;dwError = GetLastError&#40;&#41;&#41; 
                 &#125; 
            &#125; // end case 
     
            // Deal with other error cases, such as the default. 
     
        &#125; // end switch &#40;dwError = GetLastError&#40;&#41;&#41; 
     &#125; // end if
    Merci à vous deux pour votre aide

  7. #7
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Tu devrais mettre TRUE en dernier paramètre de GetOverlappedResult.

  8. #8
    Membre averti
    Inscrit en
    Février 2006
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 31
    Par défaut
    Ok mais j'ai pris ce code de la MSDN...
    En fait ReadFile asynchronous retourne toujours FALSE, non ? (puisqu'il tombera toujours sur EOF)

  9. #9
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par Taron31
    En fait ReadFile asynchronous retourne toujours FALSE, non ? (puisqu'il tombera toujours sur EOF)
    pourquoi il tombe toujours sur EOF ?

  10. #10
    Membre averti
    Inscrit en
    Février 2006
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 31
    Par défaut
    Oups, nan j'ai rien dit :-)

    Citation Envoyé par MSDN
    If EOF is detected at ReadFile time for an asynchronous read operation, ReadFile returns FALSE and GetLastError returns ERROR_HANDLE_EOF.

    If EOF is detected during subsequent asynchronous operation, the call to GetOverlappedResult to obtain the results of that operation returns FALSE and GetLastError returns ERROR_HANDLE_EOF.
    Citation Envoyé par Aurelien.Regat-Barrel
    La remarque t'explique que la "requête" n'est pas traitée sur tu es déjà en fin de fichier, en clair, le ReadFile échoue immédiatement.
    En fait, tu veux dire si le fichier est vide au départ ?

  11. #11
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Pas forcément. Ton fichier fait 10Ko, et tu fais 11 ReadFile de 1Ko. Le 11° échouera de suite...

  12. #12
    Membre émérite Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Par défaut
    Non, ça signifie que ReadFile échoue si tu as déjà parcourus l'intégralité du fichier et que tu veut le parcourir encore. Sans le fermer bien sûr.

  13. #13
    Membre averti
    Inscrit en
    Février 2006
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 31
    Par défaut
    Ok
    Merci beaucoup encore une fois...

Discussions similaires

  1. MPUSBAPI.dll : pb de ReadFile() en mode asynchrone
    Par Joccy dans le forum Bibliothèques
    Réponses: 4
    Dernier message: 15/06/2010, 09h40
  2. Problème Cancelio sur un readfile asynchrone
    Par patou21 dans le forum Windows
    Réponses: 1
    Dernier message: 07/11/2008, 12h06
  3. ReadFile Asynchrone avec OVERLAPPED
    Par superc7 dans le forum Windows
    Réponses: 22
    Dernier message: 10/05/2007, 11h28
  4. Réponses: 4
    Dernier message: 09/05/2007, 10h04
  5. Réponses: 6
    Dernier message: 25/03/2002, 21h11

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