реклама на сайте
подробности

 
 
> WinAPI - Event`ы работают не корректно
megajohn
сообщение Feb 10 2014, 14:14
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



нужно организовать алгоритм:
три задачи t1a t1b t2 ( в WinApi это Thread но сути не меняет )
нужно чтобы t1a и t1b выполнили некое действие, выставили готовность чтобы уйти в ожидание и дать управление задаче t2, задача t2 выполняет свое действие, приостанавливает свою работу и разрешает работу t1a и t1b
и снова по кругу

написал следующее (псевдокод):
Код
HANDLE events_t1_rdy[2] = { 0 };
HANDLE events_t2_rdy  = { 0 };

events_t1_rdy[0] = CreateEvent( NULL, FALSE, FALSE, NULL ); // с автосбросом
events_t1_rdy[1] = CreateEvent( NULL, FALSE, FALSE, NULL ); // с автосбросом
events_t2_rdy    = CreateEvent( NULL, TRUE,  FALSE, NULL ); // с ручным сбросом

t1a()
{
    t1a_todo();
    SetEvent( events_t1_rdy[0] );
    DWORD dwEvent = WaitForSingleObject( events_t2_rdy, 5000 );
    assert( dwEvent == WAIT_OBJECT_0 );
}

t1b()
{
    t1b_todo();
    SetEvent( events_t1_rdy[1] );
    DWORD dwEvent = WaitForSingleObject( events_t2_rdy, 5000 );
    assert( dwEvent == WAIT_OBJECT_0 );
}

t2()
{
    DWORD dwEvent = WaitForMultipleObjects( 2, events_t1_rdy, TRUE, 5000 );
    assert( dwEvent == WAIT_OBJECT_0 );
    t2_todo();
    PulseEvent( events_t2_rdy );
}


дык вот, один раз в 100тысяч - милллион раз, одна задача (t1a или t1b ) не получает что t2 готов и ловлю dwEvent = 258 = 0x102 = TIMEOUT

как лечится ?


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SM
сообщение Feb 10 2014, 14:53
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Нужно ДВА евента - events_t1a_start и events_t1b_start (оба с авторезетом) и им в t2 делать SetEvent обоим

CODE

t1a()
{
t1a_todo();
SetEvent( events_t1_rdy[0] );
DWORD dwEvent = WaitForSingleObject( events_t1a_start, 5000 );
assert( dwEvent == WAIT_OBJECT_0 );
}

t1b()
{
t1b_todo();
SetEvent( events_t1_rdy[1] );
DWORD dwEvent = WaitForSingleObject( events_t1b_start, 5000 );
assert( dwEvent == WAIT_OBJECT_0 );
}

t2()
{
DWORD dwEvent = WaitForMultipleObjects( 2, events_t1_rdy, TRUE, 5000 );
assert( dwEvent == WAIT_OBJECT_0 );
t2_todo();
SetEvent( events_t1a_start );
SetEvent( events_t1b_start );
}
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 16:51
Рейтинг@Mail.ru


Страница сгенерированна за 0.01384 секунд с 7
ELECTRONIX ©2004-2016