[so] [Tema1][Win]Parametri WaitForMultipleObjects

Bercea Gabriel gamitech at gmail.com
Thu Jul 24 15:07:38 EEST 2008


Inca un lucru de care tre sa ai grija.
Functia WaitForMultipleObjects nu accepta ca si parametru un vector de 
handleuri, duplicate. Adica in acel vector sa existe handleuri care 
descriu acelasi obiect, sau pur si simplu un handle de 2 ori.

Btw

WaitForMultipleObjects(,,,,)
{
WaitForMultipleObjectsEx(,,,Alertable = FALSE);
}

Poftim o particica din implementarea functiei sa vezi posibile cazuri de 
eroare pentru tine:

NTSTATUS NTAPI NtWaitForMultipleObjects(INN ULONG /ObjectCount/,
                                                                        
    IN _PHANDLE_  /HandleArray/,
                                                                        
     IN _WAIT_TYPE_ /WaitType/,
                                                                        
     IN BOOLEAN /Alertable/,
                                                                         
    IN _PLARGE_INTEGER_ TimeOut /OPTIONAL)
{
/*
sumar :)
*/

/

 LockInUse = TRUE;
     _KeEnterCriticalRegion_();
 
     /* Check for valid Object Count */
     if ((ObjectCount > MAXIMUM_WAIT_OBJECTS) || !ObjectCount)
    {
         _Status_ = STATUS_INVALID_PARAMETER_1; /*atentie aici */
         goto Quickie;
     }
 
     /* Check for valid Wait Type */
     if ((WaitType != WaitAll) && (WaitType != WaitAny))
     {
         Status 
<http://www.reactos.org/generated/doxygen/dc/db7/gdiplusprivate_8h.html#a6> 
= STATUS_INVALID_PARAMETER_3; /* si aici */
         goto Quickie;
     }


              /*
          Probing details  . ....
            */

 if (WaitType == WaitAll)
     {
         /* Clear the main loop variable */
         i 
<http://www.reactos.org/generated/doxygen/d1/dc4/otltags_8h.html#a37> = 0;
 
         /* Start the loop */
         do
         {
             /* Check the current and forward object */
            for (_j_ = _i_ + 1; _j_ < ObjectCount; _j_++)
             {
                 /* Make sure they don't match */
                 if (WaitObjects[i] == WaitObjects[j])
                 {
                     /* Fail */
                     _Status_ = STATUS_INVALID_PARAMETER_MIX; /* got it 
again */
                     goto Quickie;
                 }
             }
                     /* Keep looping */
                          _i_++;
         } while (_i_ < ObjectCount);
     }



   /*
     . . . .
*/


         _Status_ = _KeWaitForMultipleObjects_(ObjectCount,
                                           WaitObjects,
                                           WaitType,
                                           UserRequest,
                                           PreviousMode,
                                           Alertable,
                                           TimeOut,
                                           WaitBlockArray);
/*
nu intoarce niciodata STATUS_INVALID_PARAMETER de nici un fel, face doar 
niste recalculari de cuante de timp pentru dispatcher sau
doar pune niste APC uri pentur threadul care a facut wait ul. In 
principiu pbema e undeva mai sus.
Functia _KeWaitForMultipleObjects _poate in cel mai rau caz sa 
ExRaiseException sau sa faca un bugcheck ceea ce ar rezulta intr-un 
ecran albastru regardless of what you do, asta daca nu ai un debugger.
*/
     

/return Status;


}
/ 



Lucian Adrian Grijincu wrote:
> 2008/7/24 Alex <alexeurope2002 at yahoo.com>:
>   
>> Singura pb cu parametri ar fi la acel const Handle *. Ei in exemple am vazut
>> ca apeleaza functia cu un parametru care a fost declarat static ca vector de
>> hable-ruri. Dar asta nu ma ajuta prea mult...in principiu vreau sa aloc
>> dinamic. Dar asa nu mi-a mers...adica imi intoarce eroarea asta.
>>     
> Pare un caz standard de PEBKAC. Ori nu initializezi cum trebuie
> memoria aia, ori trimiti un pointer aiurea, ori altceva. Redu la
> maximum problema (să ai doar partea care alocă memoria, o
> initializează și o trimite lui WaitForMultipleObjects). Dacă problema
> încă se manifestă și nu te prinzi singur care e cauza postează codul
> respectiv aici (din nou, să fie un cod minimal care reproduce
> problema, nu toată tema ta).
>
>   

-------------- next part --------------
A non-text attachment was scrubbed...
Name: gamitech.vcf
Type: text/x-vcard
Size: 233 bytes
Desc: not available
Url : http://cursuri.cs.pub.ro/pipermail/so/attachments/20080724/33a598d8/attachment.vcf 


More information about the so mailing list