Помогите разобраться с WaitForSingleObject
От: ivan711  
Дата: 10.04.09 13:00
Оценка:
Добрый день. Возник вопрос по использованию функции WaitForSingleObject. Создаю мьютекс в состоянии non-signaled
HANDLE hMutex = ::CreateMutex(NULL, TRUE, NULL);

После этого запускаю WaitForSingleObject:
DWORD WaitResult = ::WaitForSingleObject(hMutex, 10000);

Вместо того, чтобы стоять и дожидаться перехода hMutex в состояние signaled (это должно произойти через некоторое время в другом потоке), функция WaitForSingleObject тут же проходит дальше (чего по идее быть не должно).

Я ошибаюсь с относительно того, как должна работать WaitForSingleObject или что-то не так с мьютексом ?
Заранее спасибо !

13.04.09 13:44: Перенесено модератором из 'C/C++' — Кодт
Re: Помогите разобраться с WaitForSingleObject
От: Аноним  
Дата: 10.04.09 13:10
Оценка:
I>Я ошибаюсь с относительно того, как должна работать WaitForSingleObject или что-то не так с мьютексом ?
I>Заранее спасибо !
с мутексом все хорошо, просто вам нужен ивент
Re: Помогите разобраться с WaitForSingleObject
От: ZAMUNDA Земля для жалоб и предложений
Дата: 10.04.09 13:14
Оценка:
Здравствуйте, ivan711, Вы писали:

I>Добрый день. Возник вопрос по использованию функции WaitForSingleObject.

Привет! По-моему, это сообщение больше подходит для форума winapi

I>Создаю мьютекс в состоянии non-signaled

Это ты так думаешь!

I>HANDLE hMutex = ::CreateMutex(NULL, TRUE, NULL);


HANDLE CreateMutex(
LPSECURITY_ATTRIBUTES lpMutexAttributes,
BOOL bInitialOwner, // если это TRUE, то Mutex захватывает себе поток, вызвавший CreateMutex
LPCTSTR lpName
);

I>Вместо того, чтобы стоять и дожидаться перехода hMutex в состояние signaled (это должно произойти через некоторое время в другом потоке), функция WaitForSingleObject тут же проходит дальше (чего по идее быть не должно).

Если Mutex кем-то захвачен, то он "горит" (Signaled State), а если он "горит", то WaitForSingleObject возвращает управление с ответом WAIT_OBJECT_0.
Наука изощряет ум; ученье вострит память.
(c) Козьма Прутков
Re: Помогите разобраться с WaitForSingleObject
От: ioni Россия  
Дата: 13.04.09 09:54
Оценка:
Здравствуйте, ivan711, Вы писали:

I>Добрый день. Возник вопрос по использованию функции WaitForSingleObject. Создаю мьютекс в состоянии non-signaled

I>HANDLE hMutex = ::CreateMutex(NULL, TRUE, NULL);

I>После этого запускаю WaitForSingleObject:

I>DWORD WaitResult = ::WaitForSingleObject(hMutex, 10000);

I>Вместо того, чтобы стоять и дожидаться перехода hMutex в состояние signaled (это должно произойти через некоторое время в другом потоке), функция WaitForSingleObject тут же проходит дальше (чего по идее быть не должно).


I>Я ошибаюсь с относительно того, как должна работать WaitForSingleObject или что-то не так с мьютексом ?

I>Заранее спасибо !

из msdn (http://msdn.microsoft.com/en-us/library/ms682411(VS.85).aspx)

HANDLE WINAPI CreateMutex(
__in_opt LPSECURITY_ATTRIBUTES lpMutexAttributes,
__in BOOL bInitialOwner,
__in_opt LPCTSTR lpName
);

bInitialOwner [in]

If this value is TRUE and the caller created the mutex, the calling thread obtains initial ownership of the mutex object. Otherwise, the calling thread does not obtain ownership of the mutex. To determine if the caller created the mutex, see the Return Values section.

....
Any thread of the calling process can specify the mutex-object handle in a call to one of the wait functions. The single-object wait functions return when the state of the specified object is signaled. The multiple-object wait functions can be instructed to return either when any one or when all of the specified objects are signaled. When a wait function returns, the waiting thread is released to continue its execution.

The state of a mutex object is signaled when it is not owned by any thread. The creating thread can use the bInitialOwner flag to request immediate ownership of the mutex. Otherwise, a thread must use one of the wait functions to request ownership. When the mutex's state is signaled, one waiting thread is granted ownership, the mutex's state changes to nonsignaled, and the wait function returns. Only one thread can own a mutex at any given time. The owning thread uses the ReleaseMutex function to release its ownership.


думаю что вам при создании нужно указать FALSE для bInitialOwner
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.