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

Visual C++ Discussion :

[WriteFile] pb avec ipOverlapped


Sujet :

Visual C++

  1. #1
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Par défaut [WriteFile] pb avec ipOverlapped
    Salut,


    ça fait déjà un moment que je cherche, et teste différentes solutions en vain...
    quelqu'un aurait-il un lien, une explication ou un bout de code montrant comment utiliser WriteFileEx et plus particulièrement le morceau concernant le fonctionnement des deux derniers arguments (ipoverlapped et ipcompletionroutine)

    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  2. #2
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    qu'est-ce que tu cherches à faire exactement ?
    écrire sur un port de manière asynchrone ?

  3. #3
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Par défaut
    Citation Envoyé par nico-pyright(c)
    qu'est-ce que tu cherches à faire exactement ?
    écrire sur un port de manière asynchrone ?

    ouais juste pour tester comment ça marche en prévision d'un futur projet... faut bien s'entrainer


    en gros, j'ai essayé de dériver par rapport à l'écriture synchrone...

    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
    #include <iostream>
    #include <string>
    #include <windows.h>
     
    using namespace std;
     
     
     
    void WINAPI FileIOCompletionRoutine(DWORD dwErrorCode,DWORD dwNbBytesTransferred,LPOVERLAPPED lpOverlapped) {
            cout << dwErrorCode << " ";
            if (dwErrorCode != 0) {
                    exit(-2);
            }
    }
     
    int main()
    {
            //HANDLE hFile = CreateFile(TEXT("C:\\TEMP\\test.txt"),GENERIC_READ|GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
            HANDLE hFile = CreateFile(TEXT("C:\\TEMP\\test.txt"),GENERIC_READ|GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL);
     
            if (hFile == INVALID_HANDLE_VALUE) {
                    cerr << "handle invalide" << endl;
                    return -1;
            }
     
            string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
     
            for (int i=0 ; i<1000000 ; i++)
            {
                    int n = rand()%26;
                    char tab[1] = {alphabet[n]};
     
                    /*DWORD writedBytes;
                    if (!WriteFile(hFile, tab ,sizeof(char),&writedBytes,NULL))
                    {
                            cerr << "erreur d'�criture" << endl;
                            exit(-1);
                    }*/
     
                    OVERLAPPED* ov = new OVERLAPPED;
                    WriteFileEx(hFile, tab ,sizeof(char),ov,FileIOCompletionRoutine);
            }
     
     
            //WaitForSingleObject(hFile,INFINITE);
            CloseHandle(hFile);
            return 0;
    }
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  4. #4
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    tu n'as pas besoin d'utiliser writefileEx pour écrire de manière asynchrone, cela te servira uniquement si tu as besoin de callback

    dans la faq vc, il y a tout une question sur le travail avec le port com, par farscape : http://c.developpez.com/faq/vc/?page...WithSerialPort

  5. #5
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Par défaut
    perso, j'ai eu des problèmes avec WriteFile en asynchrone... alors j'étais parti du côté de WriteFileEx


    EDIT: tu veux dire que si j'ajoute ov en dernier argument de WriteFile, ça marchera ?
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  6. #6
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    en avant dernier paramètre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        m_hCom = CreateFile( sz,GENERIC_READ | GENERIC_WRITE,  0,  NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED,  NULL );
    d'ailleurs, il est ou farscape ?
    Citation Envoyé par la faq
    il ne faut pas faut pas travaillé en mode synchrone c'est ingérable :
    roooohhhh

  7. #7
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Par défaut
    déjà fait cela... c'est suffisant, non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HANDLE hFile = CreateFile(TEXT("C:\\TEMP\\test.txt"),GENERIC_READ|GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL);
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  8. #8
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    j'dirai oui ...
    t'as essayé la classe de farscape ?

  9. #9
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Par défaut
    Citation Envoyé par nico-pyright(c)
    j'dirai oui ...
    t'as essayé la classe de farscape ?

    ben non... j'essaye déjà de comprendre les fonctions de manière "atomique"
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  10. #10
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Par défaut
    j'ai testé ce que tu m'as conseillé... mais ça ne marche pas
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  11. #11
    Membre chevronné
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Par défaut
    Citation Envoyé par gorgonite
    en gros, j'ai essayé de dériver par rapport à l'écriture synchrone...
    Le problème le plus évident dans ton code c'est que tu n'initialises pas la structure OVERLAPPED, ce qui est pourtant obligatoire :

    - les champs Offset et OffsetHigh doivent contenir la position 64-bit dans le fichier à partir de laquelle l'accès doit se faire. Ceci parce qu'il peut y avoir plusieurs requêtes asynchrones simultanées sur le même handle, sans qu'on puisse forcément savoir laquelle va commencer la première.

    - le champ hEvent doit être initialisé à NULL si le WaitForXXX() est fait sur le handle du fichier (cas d'une requête unique) ou sur un event valide - non signalé - s'il y a plusieurs requêtes simultanées, et qui servira pour le WaitForXXX().

    Sinon, tu n'as pas répondu à la question du callback, mais si tu peux faire sans, mieux vaut utiliser WriteFile().

  12. #12
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Par défaut
    je n'y arrive pas... voilà le 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
    #include <iostream>
    #include <string>
    #include <windows.h>
     
    using namespace std;
     
     
    int main()
    {
    	HANDLE hFile = CreateFile(TEXT("C:\\TEMP\\test.txt"), GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_FLAG_OVERLAPPED, NULL);
     
    	if (hFile == INVALID_HANDLE_VALUE) {
    		cerr << "handle invalide" << endl;
    		return -1;
    	}
     
    	string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
     
    	for (int i=0 ; i<1000000 ; i++)
    	{
    		int n = rand()%26;
    		char tab[1] = {alphabet[n]};
     
    		DWORD writedBytes;
    		OVERLAPPED* ov = new OVERLAPPED;
     
    		ov->Offset = i*sizeof(char);
    		ov->OffsetHigh = 0;
    		ov->hEvent = NULL;
    		WriteFile(hFile, tab ,sizeof(char), &writedBytes,ov);
    	}
     
     
    	WaitForSingleObject(hFile,INFINITE);
    	CloseHandle(hFile);
    	return 0;
    }

    [EDIT]ça marche[/EDIT]
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

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

Discussions similaires

  1. WriteFile avec builder 6
    Par nizzart dans le forum C++Builder
    Réponses: 3
    Dernier message: 25/04/2007, 18h35
  2. [Win API] problème avec WriteFile
    Par acryline dans le forum Windows
    Réponses: 5
    Dernier message: 02/11/2006, 09h26
  3. Problème avec WriteFile
    Par Gh0st dans le forum x86 32-bits / 64-bits
    Réponses: 2
    Dernier message: 13/07/2006, 19h32
  4. Problème d'écriture avec WriteFile
    Par Milowen dans le forum C++
    Réponses: 5
    Dernier message: 17/01/2006, 09h40
  5. probleme avec writefile
    Par exter666 dans le forum C++
    Réponses: 10
    Dernier message: 16/03/2005, 11h58

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