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 :

[MFC] fonction ReadFile qui bloque


Sujet :

MFC

  1. #1
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut [MFC] fonction ReadFile qui bloque
    Bonjour à tous,

    dans mon programme, j'utilise ReadFile() pour lire sur le port parallele. En général, ça marche, mais parfois (à cause du périphérique sur lequel je lis les données via le port parallèle), ça reste bloqué sur ReadFile.

    Y a-t-il un moyen d'éviter le freeze? J'ai pensé utiliser un try/catch, mais je ne sais pas si c'est utilisable avec ReadFile().

  2. #2
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    mouais... en fait, je vous demande ça parce que j'ai essayé de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    try
    {
    	ReadFile(hHandle, &oRxByte, 1, &dwNbBytesRead, NULL);
    } // le handle est obtenu avec un CreateFile sur "LPT1"
    catch(CException* e)
    {
    	e->ReportError();
    }
    Et ça freeze quand même (par exemple quand le câble parallèle n'est pas branché). Il n'y a vraiment pas moyen d'éviter ça?

  3. #3
    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 as essayé de configurer les timeout ? (on en n'avait pas déjà parlé ?)

  4. #4
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    oui, j'ai essayé, mais je ne suis jamais parvenu à m'en servir. J'ai vraiment tout essayé avec ces *%£¤# de timeouts, et j'ai perdu beaucoup de temps, mais sans résultats. D'ailleurs, en fouillant sur la toile, je me suis rendu compte que d'autre personnes avaient des problèmes avec ces timeouts, et que personne n'a trouvé de solution. Du coup, la plupart se sont tournés vers d'autres solutions. Moi je les ai tout simplement zappé. Et mis à part ce problème de freeze, ça marche très bien.

  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
    Si je me souviens de ton ancien problème, c'était l'inverse : ReadFile s'arrêtait trop tot car il y avait timeout...

  6. #6
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    non, mon problème c'était "paramètre invalide" pour les fonctions de timeouts (SetCommTimeouts, SetCommMask et WaitCommEvent). Alors que mes parametres étaient simples et semblaient parfaitement corrects.

  7. #7
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    et sinon, sans utiliser les CommTimeouts, il n'y pas moyen d'éviter que mon ReadFile() fasse bloquer mon appli dans le cas où il n'y a rien à lire sur le port LPT1?

  8. #8
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    par exemple, si je fais ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    try
    {
    	ReadFile(hHandle, &oRxByte, 1, &dwNbBytesRead, NULL);
    } // le handle est obtenu avec un CreateFile sur "LPT1"
    catch(CException* e)
    {
    	e->ReportError();
    }
    l'exception n'est pas récupérée s'il y a rien à lire sur LPT1. Comment cela se fait-il?

  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
    ReadFile, c'est une fonction C Win32, elle ne lève pas d'exception.
    Si SetCommTimeouts ne fonctionne pas, c'est qu'il y a un problème. Tu es sûr de la validité du handle ouvert avec CreateFile (!= INVALID_HANDLE_VALUE) ?

  10. #10
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Aurelien.Regat-Barrel
    ReadFile, c'est une fonction C Win32, elle ne lève pas d'exception.
    ha d'accord.
    Citation Envoyé par Aurelien.Regat-Barrel
    Si SetCommTimeouts ne fonctionne pas, c'est qu'il y a un problème. Tu es sûr de la validité du handle ouvert avec CreateFile (!= INVALID_HANDLE_VALUE) ?
    ouioui, absolument certain puisque:
    1/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    m_hPortHandle = CreateFile("LPT1",					...);
    if (m_hPortHandle==INVALID_HANDLE_VALUE)
    {
    	ReportLastError("CreateFile");
    	return FALSE;
    }
    Ca ne me renvoie jamais INVALID_HANDLE_VALUE.
    2/ juste après le code ci-dessus je fais un WriteFile qui fonctionne impec.

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

Discussions similaires

  1. Fonction system() qui bloque le script
    Par gre38 dans le forum Langage
    Réponses: 1
    Dernier message: 07/02/2014, 20h12
  2. Appli MFC qui 'bloque' dans CWinThread::Run()
    Par vdaanen dans le forum MFC
    Réponses: 2
    Dernier message: 26/11/2011, 09h11
  3. fonction mail() qui bloque
    Par jtitin dans le forum Langage
    Réponses: 3
    Dernier message: 24/03/2010, 19h01
  4. Programme qui bloque avec fonction sort
    Par ultimate_manx dans le forum SL & STL
    Réponses: 10
    Dernier message: 29/11/2007, 20h06
  5. Réponses: 3
    Dernier message: 22/07/2005, 15h16

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