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 :

GetOverlappedResult est bloaquante?


Sujet :

Windows

  1. #1
    Nouveau membre du Club Avatar de rzayani
    Inscrit en
    Mars 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mars 2006
    Messages : 90
    Points : 39
    Points
    39
    Par défaut GetOverlappedResult est bloaquante?
    Bonjour,

    J'ai une application qui communique avec un PC distant avec une liaison RS422.

    Pour envoyer un message, j'ai la fonction suivante:
    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
    send  (CMessage* i_message)
    {
    	OVERLAPPED   osWrite = {0};
    	int          fRes    = 0;
        DWORD        dwWritten;
    
    	
        osWrite.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
        if (osWrite.hEvent == NULL)
        {
            return;
        }
    
    	if (!WriteFile(m_PortHandle, 
                       i_message->m_data.data, 
                       i_message->m_data.length(), 
                       &dwWritten, 
                       &osWrite))
        {
            if (GetLastError() != ERROR_IO_PENDING) 
            {    
                return;
            }
            else 
            {
                if (!GetOverlappedResult(m_PortHandle, 
                                         &osWrite, 
                                         &dwWritten, 
                                         TRUE))
                {
                    return;
                }
                else
                {
                    if (dwWritten != i_message->m_data.length()) 
                    {
                        // Time out écoulé sans pouvoir écrire les données 
                        return;
                    }
                    else
                    {
                        // Données écrites avec succées sur le port 
                        fRes = dwWritten;
                    }
                }
            }
        } 
        else
        {
            fRes = dwWritten;
        }
    
        CloseHandle(osWrite.hEvent);
    	
    }

    En plus, il faut que le durée de l'exécution de la fonction suivante ne dépasse pas le 20 millisec.

    Mon question: Est ce que l'envoi sur la liaison série est bloquant?
    Si oui comment je peux envoyer un message d'une façon non bloquante?


    Merci pour vos réponses

  2. #2
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Je n'y connais rien donc en fait je peux juste te proposer une solution pour la deuxième question ^^

    Fait ton truc de connection dans un thread, et au bout de 20ms tu kill le thread.

  3. #3
    Expert éminent sénior

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

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 754
    Points : 10 719
    Points
    10 719
    Billets dans le blog
    3
    Par défaut
    Tu as spécifié TRUE en dernier parametre, alors elle attend...
    20 ms c'est vraiment tres peu, n'espere pas quelque chose de fiable.
    Utilise WaitForSingleObject sur osWrite.hEvent en spécifiant le timeout voulu.

  4. #4
    Nouveau membre du Club Avatar de rzayani
    Inscrit en
    Mars 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mars 2006
    Messages : 90
    Points : 39
    Points
    39
    Par défaut
    Et si je spécifie FALSE en dernier parametre.
    Est ce que le durée de l'exécution peu dépasser le 20 millisec?

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    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 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Citation Envoyé par Aurelien.Regat-Barrel
    20 ms c'est vraiment tres peu, n'espere pas quelque chose de fiable.
    Ça veut dire oui, à mon avis...

  6. #6
    Expert éminent sénior

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

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 754
    Points : 10 719
    Points
    10 719
    Billets dans le blog
    3
    Par défaut
    Aucun rapport...
    Ce parametre n'influence pas la durée d'exécution. Aucun parametre influence la durée d'exécution. Tu as demandé a Windows d'écrire : il le fait, et ca prend le temps qu'il a décidé que ca prendra, car il le fait en parallele a ton code. Ton code ne fait qu'attendre que Windows lui signale que l'opération est terminée.

    Si tu veux limiter a 20ms, il faut attendre avec timeout la fin de l'écriture (WaitForSingleObject). S'il y a eu timeout au lieu d'un success, c'est que l'écriture n'est pas terminée, et il faut alors l'annuler, avec CancelIo. GetOverlappedResult sert a tester le résultat de l'opération (success/échec).

  7. #7
    Nouveau membre du Club Avatar de rzayani
    Inscrit en
    Mars 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mars 2006
    Messages : 90
    Points : 39
    Points
    39
    Par défaut
    Puis ce que mon liaison est asynchrone.
    Est ce que c'est possible d'envoyer les messages sans attendre la fin de l'envoie?
    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
    send  ()
    {
        OVERLAPPED   osWrite = {0};
        int          fRes    = 0;
        DWORD        dwWritten;
     
        // Créer le message à envoyé
        CMessage* l_message = CreateMessage()
    
    	
        osWrite.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
        if (osWrite.hEvent == NULL)
        {
            return;
        }
     
        WriteFile(m_PortHandle, 
                       l_message->m_data.data, 
                       l_message->m_data.length(), 
                       &dwWritten, 
                       &osWrite);
    }
    merci Aurelien pour vos réponses

  8. #8
    Expert éminent sénior

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

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 754
    Points : 10 719
    Points
    10 719
    Billets dans le blog
    3
    Par défaut
    C'est déja ce que tu fais en utilisant la structure OVERLAPPED. GetOverlappedResult (get...OVERLAPPED...result) permet de tester si l'opération a été achevée ou bien si elle est toujours en cours, sauf si tu spécifies TRUE ou elle attend alors qu'elle soit terminée.

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

Discussions similaires

  1. Qu'est ce qu'un grand projet ?
    Par Geronimo dans le forum Débats sur le développement - Le Best Of
    Réponses: 62
    Dernier message: 04/04/2013, 15h52
  2. Quel est le meilleur script PHP de portail (CMS) ?
    Par Lana.Bauer dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 187
    Dernier message: 18/10/2012, 08h45
  3. Quelle est la fiabilité du protocole SSL ?
    Par Anonymous dans le forum Développement
    Réponses: 5
    Dernier message: 05/09/2002, 14h31
  4. apprentissage du C est-il necessaire pour C++ ?
    Par Anonymous dans le forum C
    Réponses: 6
    Dernier message: 02/05/2002, 13h56
  5. C'est quoi exactement un générateur d'états
    Par Henry Cesbron Lavau dans le forum Outils de restitution et d'analyse
    Réponses: 0
    Dernier message: 02/04/2002, 20h15

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