Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как проверить сотояние события?  (Прочитано 16306 раз)
0 Пользователей и 1 Гость смотрят эту тему.
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« : 16-08-2006 05:59 » 

Можно это сделать иначе как :

if (WFSO(evEvent,0)!=WAIT_TIMEOUT)
Записан

Да да нет нет все остальное от лукавого.
Alex437
Гость
« Ответ #1 : 16-08-2006 06:08 » 

А что такое WFSO? Здесь была моя ладья...

Обычно проверяют так
Код:
if(WaitForSingleObject(hEvent, 0) == WAIT_OBJECT_0)
Записан
Alex437
Гость
« Ответ #2 : 16-08-2006 06:10 » 

А, про WFSO понял.  Улыбаюсь

А зачем проверять иначе?
Записан
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 16-08-2006 06:47 » 

 В принципе не зачем, просто может быть есть более быстрый способ.
Записан

Да да нет нет все остальное от лукавого.
GlukSoft
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 18-08-2006 20:21 » 

Другого способа проверки не знаю, а иногда хотелось бы, т.к. WFSO приводит к отдаче выполнения другому потоку.
Записан

Fatal error C1: Brain expected
Alex437
Гость
« Ответ #5 : 19-08-2006 20:50 » 

WFSO приводит к отдаче выполнения другому потоку.
В каком смысле?
Записан
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 21-08-2006 04:16 » 

По идее WFSO  останавливает исполенение потока ипередает управление планеровщику, который возобнавляет исполнение потока при возни кновении события или по истечении таймаута. Но возможно там есть оптимизация для таймаута =0.


Мне вобщемто нужно было решить другую задачу, есть 3  десятка событий и мютексов которые синхронизируют работу много поточного сервера. При работе наблюдаются не которые аномалии, в связи счем встраиваю подситему самодиагностики. Для этого мне и нужно узнать сотояние событий и мютексов. При этом желательно не вмешивась в работу остальной части... те   

if(WaitForSingleObject(hMutex, 0) == WAIT_OBJECT_0)   

не желательно.
 
Записан

Да да нет нет все остальное от лукавого.
sss
Специалист

ru
Offline Offline

« Ответ #7 : 21-08-2006 06:35 » 

Цитата: MSDN

WaitForSingleObject
...
If dwMilliseconds is zero, the function tests the object's state and returns immediately.


Вроде бы поток не переключает контекст как в случае Sleep (0).

Цитата: MSDN

Sleep
...
A value of zero causes the thread to relinquish the remainder of its time slice to any other thread of equal priority that is ready to run. If there are no other threads of equal priority ready to run, the function returns immediately, and the thread continues execution.


« Последнее редактирование: 17-12-2007 05:07 от Алексей1153++ » Записан

while (8==8)
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 21-08-2006 07:28 » 

SSS, а как быть с зянятым мутексом? Нет конечно можно сделать релиасе, но кто не хочется мне вмешиваться. Не ужили нет возможности получить информацию по состоянию объекта. 
Записан

Да да нет нет все остальное от лукавого.
sss
Специалист

ru
Offline Offline

« Ответ #9 : 21-08-2006 08:00 » 

Так вроде бы и написано, что с 0 только тестирует состояние и сразу же возвращается А черт его знает...
Записан

while (8==8)
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 21-08-2006 08:09 » 

Даже  мютекса?
Записан

Да да нет нет все остальное от лукавого.
sss
Специалист

ru
Offline Offline

« Ответ #11 : 21-08-2006 08:16 » 

Цитата: MSDN

The WaitForSingleObject function can wait for the following objects:

  • Change notification
  • Console input
  • Event
  • Job
  • Memory resource notification
  • Mutex
  • Process
  • Semaphore
  • Thread
  • Waitable timer

Записан

while (8==8)
sss
Специалист

ru
Offline Offline

« Ответ #12 : 21-08-2006 08:18 » 

А черт. До меня доперло. Тебе ведь необходимо что бы состояние не менялось...
Записан

while (8==8)
sss
Специалист

ru
Offline Offline

« Ответ #13 : 21-08-2006 08:28 » 

Никогда не использовал 0. Состояние мьютекса в сигнальном состоянии меняется на несигнальное при вызове с WaitForSingleObject( hMutex, 0) ?
Записан

while (8==8)
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #14 : 21-08-2006 08:44 » 

Вот караз изза мютексов я и задался этим вопросом....
По если верить рихрету свободный мютекс будет захвачен... на практике не проверял,  я пока что обертку пишу, формирование снапшота состояния системы оставил на десерт. 

Записан

Да да нет нет все остальное от лукавого.
Dimitry
Гость
« Ответ #15 : 16-09-2006 20:46 » 

Тем не менее, если событие находится в свободном состоянии и для него не установлен флаг bManualReset(передаётся в функцию создания события), то оно переводится в занятое состояние и возвращается значение WAIT_OBJECT_0. Поэтому после выполнения вызова WaitForSingleObject(hEvent, 0) событие с bManualReset = FALSE всегда окажется в несвободном состоянии. Аналогичная ситуация и с Mutex'ами - поток захватывает Mutex.

Поэтому, банальное добавление таких "проверок" может разладить всю работу программы. Чтобы избаыиться от этого, нужно делать проверки так:

Код:
if ((WaitForSingleObject(hEvent, 0) == WAIT_OBJECT_0)
{
  SetEvent(hEvent);
  ...
}

if (WaitForSingleObject(hMutex, 0) == WAIT_OBJECT_0)
{
  ReleaseMutex(hMutex);
  ...
}
Т.е. если мы обнаруживаем, что мы поменяли состояние объекта - то нужно вернуть его в прежнее состояние. Что касается планирования, то действительно, при вызове любой(!) функции, ожидающей объекта(естественно, в том числе и WaitForSingleObject()), поток теряет остаток кванта процессорного времени и вызывается планировщик для выбора нового потока. Однако, если других готовых потоков нет - то, естественно, продолжится выполнение потока, вызвавшего функцию ожидания.

P.S. Ну и на последок - маленькая программка-пример и её вывод:
Код:
#include <stdio.h>
#include <windows.h>



int main(void)
{
  HANDLE hEvent;

  hEvent = CreateEvent(NULL, 0, 1, NULL);

  printf("%d\n", WaitForSingleObject(hEvent, 0)==WAIT_OBJECT_0);
  printf("%d\n", WaitForSingleObject(hEvent, 0)==WAIT_OBJECT_0);



  return 0;
}
Вывод:
Код:
1
0
« Последнее редактирование: 18-12-2007 21:46 от Алексей1153++ » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines