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

besoin d'explication sur GetOverlappedResult [.net c++] - C#/.NET managed - Programmation

Marsh Posté le 16-05-2006 à 19:39:56    

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

Reply

Marsh Posté le 16-05-2006 à 19:39:56   

Reply

Marsh Posté le 16-05-2006 à 19:58:25    

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


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 16-05-2006 à 20:04:40    

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

Reply

Marsh Posté le 19-05-2006 à 19:22:44    

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

Reply

Marsh Posté le 19-05-2006 à 20:07:15    

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

Reply

Marsh Posté le 19-05-2006 à 20:13:35    

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

Reply

Marsh Posté le 19-05-2006 à 23:22:35    

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.

Reply

Marsh Posté le 20-05-2006 à 00:11:03    

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
 
 
 
 
 
 
 
 
 
 

Reply

Marsh Posté le 20-05-2006 à 12:00:56    

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
Reply

Marsh Posté le 20-05-2006 à 12:43:27    

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

Reply

Marsh Posté le 20-05-2006 à 12:43:27   

Reply

Marsh Posté le 20-05-2006 à 12:52:45    

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

Reply

Marsh Posté le 20-05-2006 à 13:58:30    

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
Reply

Marsh Posté le 20-05-2006 à 14:09:41    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed