Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1671 connectés 

  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  [.net c++] besoin d'explication sur GetOverlappedResult

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[.net c++] besoin d'explication sur GetOverlappedResult

n°1368167
stgi02
Posté le 16-05-2006 à 19:39:56  profilanswer
 

bonsoir,
je prog sur visual studio .net c++
 
est que vous pouvez m'aider pour m'expliquer ce code :

Code :
  1. if (!WaitCommEvent ( hComm,&dwEvtMask,&ov)){ // je comprend que ça attend l'evenèment placé dans SetCommMask
  2. if(GetLastError()==ERROR_IO_PENDING) { // si WaitCommEvent echoue( en attente) l'erreur est ERROR_IO_PENDING
  3. DWORD dwResult // à partir d'ici je ne comprend plus bien
  4. while(!GetOverlappedResult(hComm,&ov,&dwResult,true)){  // a qoui sert GetOverlappedResult est ce qu'il est utile (j'ai fais un test si j'enlève cette boucle , les conséquences sont que la charge du CPU est à 100%
  5. if (GetLastError()==ERROR_IO_INCOMPLETE){
  6.                         break;
  7.                      }
  8.               }
  9.            }
  10. }


 
si vous pourriez me donner une explication complète car j'en ai besoin pour un RAPPORT;
merci bcp de votre aide

mood
Publicité
Posté le 16-05-2006 à 19:39:56  profilanswer
 

n°1368175
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 16-05-2006 à 19:58:25  profilanswer
 

http://msdn.microsoft.com/library/ [...] result.asp


---------------
J'ai un string dans l'array (Paris Hilton)
n°1368179
stgi02
Posté le 16-05-2006 à 20:04:40  profilanswer
 

c'est bien gentil mais... j'ai déjà été voir sur msdn mais je n'arrive pas à bien comprendre.

n°1370830
stgi02
Posté le 19-05-2006 à 19:22:44  profilanswer
 

est ce que quelqu'un pourrait sur la question que j'ai posé, car j'en ai besoin
merci d'avance

n°1370854
breizhbugs
Posté le 19-05-2006 à 20:07:15  profilanswer
 

Salut,
Cela permet de retrouver le resultat d'une operation asynchrone.

n°1370860
stgi02
Posté le 19-05-2006 à 20:13:35  profilanswer
 

merci de bien vouloir m'aider
 
est ce que je suis obligé de mettre getoverllapedresult dans mon code et que serait les conséquence sans cette fonction
 
est ce qu'il faut traiter les erreurs quand on utilise waitCommEvent  
 
merci  bcp

n°1370933
breizhbugs
Posté le 19-05-2006 à 23:22:35  profilanswer
 

il faut toujours traiter les erreurs...
 
Pour savoir quels sont les conséquences il faut savoir ce que fait le programme et c'est pas avec le peu que tu donnes que l'on peut le deviner.
 
ex: une fonction qui fait une addition (asynchrone)(bon faut imaginer un grosse addition), getoverlappedresult permettra d'en connaitre le resultat.

n°1370950
stgi02
Posté le 20-05-2006 à 00:11:03  profilanswer
 

merci de m'aider,
 
au faite j'ai réalisé un programme sur la communication série
le programme que j'ai mis se trouve dans un thread je m'explique:
 
 

Code :
  1. DWORD WINAPI ReceptionDataThread(LPVOID p) // le thread de réception
  2. {//a
  3.         while ( var ) // var est vrai jusqu' a l 'arrêt du  
  4.                                      
  5.         {//b
  6. DWORD dwEvtMask = 0;
  7.     OVERLAPPED ov = {0}; 
  8.                      
  9. ov.hEvent= CreateEvent ( NULL,FALSE,FALSE,NULL);
  10. if (!WaitCommEvent ( hComm,&dwEvtMask,&ov))  {
  11. // WaitCommEvent attend un évènement pour se produire, l'évènement attendu est EV_RXCHAR  
  12.        if(GetLastError()==ERROR_IO_PENDING)  {
  13.            
  14.              DWORD dwResult;
  15.                
  16.              while(!GetOverlappedResult(hComm,&ov,&dwResult,true))  {
  17. if (GetLastError()==ERROR_IO_INCOMPLETE)  {
  18.                   break;
  19.                         }
  20.                        }
  21.                    }
  22.          }
  23. if (dwEvtMask == EV_RXCHAR)
  24. {
  25.  // traitement pour envoyer les données  
  26. }
  27. }//b
  28. return false ;
  29. }//a


 
voila mon code , ce que je ne comprends c'est pourquoi gérer les erreurs?
pourquoi utiliser GetOverlapped dans une boucle??
si j' enlève la gestion des erreur , la conséquence est que la charge du CPU se met à 100%
 
j'èspere que je suis clair des les explications, pour que vous puissez m'aider.
 
merci bcp
 
 
 
 
 
 
 
 
 
 

n°1371017
breizhbugs
Posté le 20-05-2006 à 12:00:56  profilanswer
 

Salut,

Citation :


    WaitCommEvent ( hComm,&dwEvtMask,&ov))  
// WaitCommEvent attend un évènement pour se produire, l'évènement attendu est EV_RXCHAR  


En fait d'apres la doc, puisque l'on utilise 'ov', cela veut dire que 'hCom' a été ouvert en mode overlapped (asynchrone).
Donc contrairement au commentaire, le waitcommEvent n'attends pas
Si l'evenement a pas eu lieu, getlasterror renvoie ERROR_IO_PENDING
donc on entre dans getoverlappedresult qui lui fera l'attente (car son parametre bWait vaut true).
Dans ce mode d'attente, le processeur 'ne tourne pas' et ne consomme rien, jusqu'a ce que l'evenement 'ov.hEvent' a lieu. ce qui permet de sortir du while (!getoverlappedresult...).
 
Si tu supprime le test de getoverlappedresult, le programme va boucler sur waitcommeevent jusqu'a ce que cela devienne bon, et chaque tour de boucle 'fait tourner' le processeur.


Message édité par breizhbugs le 20-05-2006 à 12:03:15
n°1371033
stgi02
Posté le 20-05-2006 à 12:43:27  profilanswer
 

ok merci
 
quand vous dites que WaitcommEvent n'attend pas , ca veut dire que di l'evenement n'est pas là le programme va tourner sur getOverlalpped jusu'au moment où l'evenement se produit, si cela si produit l

mood
Publicité
Posté le 20-05-2006 à 12:43:27  profilanswer
 

n°1371037
stgi02
Posté le 20-05-2006 à 12:52:45  profilanswer
 

ok merci  
 
quand vous dites que WaitcommEvent n'attend pas , ca veut dire que si l'evenement n'est pas là le programme va tourner sur getOverlalppedResult jusqu''au moment où l'evenement se produit, mais est ce que dans cette boucle le programme ne passe jamais sur getLastError?? et pourquoi avoir cela ici?
 
si l'évenement se produit, est que la fonction WaitCommEvent sera vraie et la suite du programme pourra avoir lieu?  
 
merci bcp de votre aide

n°1371062
breizhbugs
Posté le 20-05-2006 à 13:58:30  profilanswer
 

Bon j'essaie de commenter le code:

Code :
  1. DWORD WINAPI ReceptionDataThread(LPVOID p)
  2. {
  3.      while ( var ) // var ? inconnu  
  4.      {
  5.           DWORD dwEvtMask = 0;
  6.           OVERLAPPED ov = {0}; 
  7.           ov.hEvent= CreateEvent ( NULL,FALSE,FALSE,NULL); // on cree un evenement
  8.           // hComm inconnue, mais supposé ouvert en asynchrone(overlapped)
  9.           // Cela veut dire que 1- waitcommeEvent n'attend pas qu'un evenement se produit sur hcomm(EV_RXCHAR ou autre) pour retourner
  10.           //                          2- lorsqu'un evenement sur hComm se produira, l'evenement ov.hEvent sera vrai.
  11.           if (!WaitCommEvent ( hComm,&dwEvtMask,&ov))
  12.           {
  13.                if(GetLastError()==ERROR_IO_PENDING)
  14.                // on arrive ici si l'evenement (EV_RXCHAR ou autre) n'as pas eu lieu
  15.                {
  16.                     DWORD dwResult;
  17.                     while(!GetOverlappedResult(hComm,&ov,&dwResult,true))
  18.                     // ici on attends qu'un evt EV_RXCHAR ou autre arrive
  19.                     {
  20.                          if (GetLastError()==ERROR_IO_INCOMPLETE)
  21.                          // Si getoverlapedresult se passe bien, on arrive jamais ici.  
  22.                          {
  23.                               break;
  24.                          }
  25.                     }
  26.                }
  27.           }
  28.           if (dwEvtMask == EV_RXCHAR)
  29.           {
  30.                // traitement pour envoyer les données  
  31.           }
  32.      }//b
  33.      return false ;
  34. }//a


Mais bon faut regarder la doc MSDN, peut pas t'en dire plus moi, ou sinon voit avec celui qui a ecrit le code.


Message édité par breizhbugs le 20-05-2006 à 13:59:08
n°1371068
stgi02
Posté le 20-05-2006 à 14:09:41  profilanswer
 

pour l'écriture j'ai fais ce code:
 
WriteFile(hComm,(LPCVOID)buf,dwtoWrite,&dwWritten,ov);
 
while(!GetOverlappedResult(hComm,ov,&dwResult,true)){
 
 
}
est ce que pour ce code, les réponses que vous m'avez données sont valable
 
le faite que je suis en mode overlapped , ça me permet d'écrire ou de lire en mode asynchrone c'est  à dire que je n'ai pas besoin de dire de combien d'octet je dois lire ou écrire, contrairement au mode synchrone
merci


Message édité par stgi02 le 20-05-2006 à 18:31:25

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  [.net c++] besoin d'explication sur GetOverlappedResult

 

Sujets relatifs
[MCD] besoin aide pour creer baseBesoin d'aide
besoin d'aide vbaBesoin d'aide pour un premier programme
Besoin d'aide sur un code "copier - coller"= new Function ("return false") > explication SVP
1-Tier 2-Tier 3-Tier N-Tier... besoin d'explicationsbesoin d'aide pour faire un puissance 4 avec structures
pblm de requete SQL besoin aide !!!besoin d'aide pour naviguation dans page HTML
Plus de sujets relatifs à : [.net c++] besoin d'explication sur GetOverlappedResult


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR