[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