ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
25 ноября
110999 Топик полностью
=AlexD= (23.01.2008 13:58, просмотров: 171) ответил Argon на Кроме меня кто-то сталкивался с таким багом? Еще раз его суть: при ожидании флага с таймаутом ОС сбрасывает флаг принудительно при исходе времени, что иногда влечет пропуски флага.
Ну так поправь исходник, раз считаешь что не правильно работает. Сейчас посмотрел - действительно, проверяется только факт того, кончился таймаут или нет. Не знаю, почему так сделано.  bool OS::TEventFlag::Wait(TTimeout timeout) { TCritSect cs; if(Value == efOn) { Value = efOff; return true; } else { TProcessMap PrioTag = GetPrioTag(Kernel.CurProcPriority); SetPrioTag(ProcessMap, PrioTag); // put current process to wait map ClrPrioTag(Kernel.ReadyProcessMap, PrioTag); // remove current process from ready map TBaseProcess* p = Kernel.ProcessTable[Kernel.CurProcPriority]; p->Timeout = timeout; Kernel.Scheduler(); ClrPrioTag(ProcessMap, PrioTag); // remove current process from wait list Value = efOff; word t = p->Timeout; p->Timeout = 0; if(timeout == 0) return true; if(t) return true; else return false; } } // Исправить на: bool OS::TEventFlag::Wait(TTimeout timeout) { TCritSect cs; if(Value == efOn) { Value = efOff; return true; } else { TProcessMap PrioTag = GetPrioTag(Kernel.CurProcPriority); SetPrioTag(ProcessMap, PrioTag); // put current process to wait map ClrPrioTag(Kernel.ReadyProcessMap, PrioTag); // remove current process from ready map TBaseProcess* p = Kernel.ProcessTable[Kernel.CurProcPriority]; p->Timeout = timeout; Kernel.Scheduler(); ClrPrioTag(ProcessMap, PrioTag); // remove current process from wait list p->Timeout = 0; if (Value == efOn) { Value = efOff; return true; } return false; } } И всего делов. Правда я не тестировал - сам проверяй. Фихли ты сидишь, и ждёшь с моря погоды?
Три кита на которых зиждется реклама: враньё, преувеличение, замалчивание. Новости СМИ - это политическая реклама.