|
|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Andrew Ezhguroff 2:5020/400 13 Oct 2002 16:08:17 To : Andrew Ezhguroff Subject : Re: Сортировка "наобо рот" -------------------------------------------------------------------------------- Привет! "Andrew Ezhguroff" <eandr@com2com.ru> сообщил(а): Вот такой набросок алгоритма на псевдокоде: type _List_Msg := record Next_Msg: ^_List_Msg; Val_Msg : _Message ; end record; type _Queue := record Prev_Queue: integer ; Next_Queue: integer ; Time_Msg : long ; Beg_Msg : ^_List_Msg; End_Msg : ^_List_Msg; end record; var Tab_Queue: array [0..0xFF] of _Queue; Cur_Queue: integer(-1); // Параллельный процесс - выдача сообщений устройствам task Put_Msg; var Delta_Time: long ; Tmp_Msg : ^_List_Msg; begin loop wait while Cur_Queue==(-1); // Приостанавливаем, пока список пуст Delta_Time:=Min_Time-(Get_Time()-Tab_Queue[Cur_Queue].Time_Msg); if Delta_Time>0 then // Приостанавливаем, пока не истекло время wait time(Delta_Time); end if; // Собственно отправка сообщения Tmp_Msg:=Tab_Queue[Cur_Queue].Beg_Msg; send_message(Cur_Queue, Tmp_Msg^.Val_Msg); Tab_Queue[Cur_Queue].Time_Msg:=Get_Time(); critical // Удаляем сообщение из очереди Tab_Queue[Cur_Queue].Beg_Msg:=Tmp_Msg^.Next_Msg; delete Tmp_Msg; if Tab_Queue[Cur_Queue].Beg_Msg!=NULL then // Если очередь не пуста, переходим к следующей очереди Cur_Queue:=Tab_Queue[Cur_Queue].Next_Queue; elsif Cur_Queue!=Tab_Queue[Cur_Queue].Next_Queue then // Если в списке более одной очереди, // удаляем пустую очередь из списка Tab_Queue[Tab_Queue[Cur_Queue].Next_Queue].Prev_Queue:= Tab_Queue[Cur_Queue].Prev_Queue; Tab_Queue[Tab_Queue[Cur_Queue].Prev_Queue].Next_Queue:= Tab_Queue[Cur_Queue].Next_Queue; Cur_Queue:=Tab_Queue[Cur_Queue].Next_Queue; else // Если непустых очередей нет, обнуляем список Cur_Queue:=(-1); end if; end ctitical; end loop; end task; // Интерфейс - занесение сообщения в очередь interface Out_Msg(Device: integer, Msg: Message); var Tmp_Msg : ^_List_Msg; begin critical // Добавляем сообщение к очереди Tmp_Msg :=new _List_Msg(Message); if Tab_Tab_Queue[Device].Beg_Msg!=NULL then // Если очередь не пуста Tab_Tab_Queue[Device].End_Msg^.Next_Msg:=Tmp_Msg; else // Если очередь пуста Tab_Tab_Queue[Device].Beg_Msg:=Tmp_Msg; if Cur_Queue==(-1) then // Добавляем очередь в пустой кольцевой список Cur_Queue:=Device; Tab_Queue[Device].Prev_Queue:=Device; Tab_Queue[Device].Next_Queue:=Device; else // Добавляем очередь в непустой кольцевой список // Это простейший вариант, желательно его немного усложнить, // чтобы добавлять не в "конец", а по времени отправки // последнего сообщения Tab_Queue[Device].Next_Queue:=Cur_Queue; Tab_Queue[Device].Prev_Queue:=Tab_Queue[Cur_Queue].Prev_Queue; Tab_Queue[Tab_Queue[Cur_Queue].Prev_Queue].Next_Queue:=Device; Tab_Queue[Cur_Queue].Prev_Queue:=Device; end if; end if; Tab_Tab_Queue[Device].End_Msg:=Tmp_Msg; end critical; end interface; С уважением, Андрей. -- Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru --- ifmail v.2.15dev5 * Origin: Talk.Mail.Ru (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/6488a8a20d98.html, оценка из 5, голосов 10
|