ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
25 ноября
111233 Топик полностью
=AlexD= (25.01.2008 13:00, просмотров: 337) ответил =AlexD= на Или даже так:
Т.е. если ожидающих события нет - для них ставицца общий Value, если есть - индивидуальные Flags. Ну а если быть совсем точным, вероятно нужно что-то вроде:  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); // это уже не нужно !!!!! p->Timeout = 0; if (Flags & PrioTag) // if waked-up by signal() or signal_ISR() { ClrPrioTag(Flags, PrioTag); // clear flag for current process return true; } return false; // otherwice waked-up by timeout or by OS::ForceWakeUpProcess() } } //------------------------------------------------------------------------------ void OS::TEventFlag::Signal() { TCritSect cs; if (ProcessMap) { Flags |= ProcessMap; } else { Value = efOn; } Kernel.ReadyProcessMap |= ProcessMap; // place all waiting processes to ready map ProcessMap = 0; // сброс карты ожидающих процессов Kernel.Scheduler(); }
Три кита на которых зиждется реклама: враньё, преувеличение, замалчивание. Новости СМИ - это политическая реклама.