Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Смешанный алгоритм: FIFO+абсолютный приоритет [D5, WinXP]


sergey_spy ©   (2005-06-21 14:23:00) 

Как реализовать на Делфи алгоритм ФИФО вместе с абсолютным приоритетом?
Т.е. - первый пришел первый и обработался, но если у пришедшего процесса приоритет выше чем у выполняемого в данный момент, то выполнение процесса прекращается и начинает выполнятся процесс с высшим приоритетом.
P.S. Если можна пример кода.


Sergey_spy   (2005-06-21 18:15:00) [1]


> TUser ©


> wal ©


> -=XP=- ©

Большое вам спасибо, я уже нашел решение реализации "этого" для себя!
З.Ы. Супер форум. Спасибо создателям! Но ветку еще не закрывайте - могут еще появится вопросы по этой теме.


-=XP=-   (2005-06-21 17:13:00) [2]

Глюк присутствует


-=XP=-   (2005-06-21 17:11:00) [3]

Как-то так:

TTask = class
public
 procedure Start;
 procedure Stop;
 property Priority: integer;
 property OnFinish: TNotifyEvent;
end;

TExcludeQueue = class
private
 FRunningTask: TTask;
 FTaskList: TList; // Низший приоритет - начало очереди, высший - конец.
 procedure OnTaskFinish(ASender: TObject);
 procedure SetRunningTask(ATask: TTask);
public
 procedure RunTask(ATask: TTask);
 property RunningTask: TTask read FRunningTask write SetRunningTask;
end;

procedure TExcludeQueue.RunTask(ATask: TTask);
var
 i: integer;
 InQueue: TTask;
begin
 ATask.OnFinish := OnTaskFinish;
 if RunningTask = nil then
   RunningTask := ATask
 else
 begin
   if (RunningTask.Priority < ATask.Priority) then
   begin
     InQueue := RunningTask;
     RunningTask := ATask;
   end
   else
     InQueue := ATask;
   for i := 0 to FTaskList.Count - 1 do
     if TTask(FTaskList[i]).Priority > InQueue then
     begin
       FTaskList.Insert(i, InQueue);
       Exit;
     end;
   FTaskLits.Add(InQueue);
 end;
end;

procedure TExcludeQueue.OnTaskFinish(ASender: TObject);
begin
 if FTaskList.Count > 0 then
 begin // Сделующая задача из списка
   RunningTask := FTaskList[FTaskList.Count - 1];
   FTaskList.Remove(RunningTask);
 end;
end;

procedure TExcludeQueue.SetRunningTask(ATask: TTask);
begin
 if FRunningTask <> ATask then
 begin
   if FRunningTask <> nil then
     FRunnigTask.Stop;
   FRunningTask := ATAsk;
   if FRunningsTask <> nil then
     FRunningTask.Start;
 end;
end;


wal   (2005-06-21 16:55:00) [4]

Создай несколько очередей (столько, сколько градаций приоритета). Складивай в них задания (или что там у тебя) в соответствии с их приоритетом. Очереди просматривай по очереди (во сказанул), начиная с наивысшей по приоритету. В случае прихода нового задания во время обработки: а) склыдируешь его в соответствующую очередь; б) сравниваешь его приоритет с текущим, если <=, то продолжаешь текущее, иначе прерываешь текущее; в) просматриваешь очередь(и) сначала.

С уважением

ЗЫ. Смотри, неприоритетные очереди не переполни.


pasha_golub   (2005-06-21 16:37:00) [5]

Ну, я не пойму, почему бы потокам не выставлять нужный приоритет и пусть система разруливает.


TUser   (2005-06-21 16:36:00) [6]

Организуй отдельную очередь для каждого приоритета.


Sergey_spy   (2005-06-21 16:05:00) [7]



          |<-------прекращение выполнения--|        
          |                                |
          |                n+2 ______      |
          |              |--->|      |     |
          |              | n+1|      |---->|
входн.поток-->(очередь)-->|--->|  ЦП  |
                         |  n |      |----> конец обслужив.
                         |--->|______|

n - приоритет

Задача с наивысшим приоритетом выполняется в первую очередь и если она не выполнена, а в это время поступили несколько задач с таким же приоритетом, то они становятся в очередь "первый пришел - первый ушел".
Если нет задач с наивысшим приоритетом, то выполняются задачи с низшим приоритетом. Но если в процессе выполнения задачи поступает задача с более высоким приоритетом, то она прекращает выполнятся.

Так понятно?


TUser   (2005-06-21 15:47:00) [8]

Запиши свою схему в тегах CODE - кнопочка КОД справа.


Sergey_spy   (2005-06-21 15:43:00) [9]


> Digitman ©   (21.06.05 15:37)


нет ОС непишу.
Мне очень нужен этот алгоритм, нигде не могу его найти!


Sergey_spy   (2005-06-21 15:38:00) [10]


> Но задача вообще непонятна.

           
почему-то все искажает^ - попробую повторить:
.
           |<-------прекращение выполнения--        
           |                                |
           |                n+2 ______      |
           |              |--->|      |     |
           |              | n+1|      |---->|
входн.поток-->(очередь)--> |--->|  ЦП  |
                          |  n |      |----> конец обслужив.
                          |--->|______|

n - приоритет
Что-то вроде этого!!!


Digitman   (2005-06-21 15:37:00) [11]


> Sergey_spy   (21.06.05 15:31) [5]


ты ОС что ли пишешь ?)


Sergey_spy   (2005-06-21 15:31:00) [12]

|<-------прекращение выполнения-        
           |                               |
           |               n+2 ______      |
           |             |--->|      |     |
           |             | n+1|      |---->|
входн.поток-->(очередь)-->|--->|  ЦП  |
                         |  n |      |----> конец обслужив.
                         |--->|______|

n - приоритет
Что-то вроде этого!!!


TUser   (2005-06-21 14:46:00) [13]

Так есть FIFO, есть один выполняемый процесс. Когда процесс приходит, то вне зависимости от того, о чем вообще тут идет речь, делаем так
if NewProcess.Priority > CurrentProcess.Priority then
begin
 CurrentProcess.Stop;
 Push(CurrentProcess);
 CurrentProcess:=NewProcess;
end;

Но задача вообще непонятна.


Alex*   (2005-06-21 14:37:00) [14]

Интересно,  а сам смысл FIFO не теряется, если "перепрыгивать" придется?


Eraser   (2005-06-21 14:34:00) [15]

sergey_spy   (21.06.05 14:23)

Возможно тут найдёшь ответ: http://mbo88.narod.ru/ToC.html

Т.е. - первый пришел первый и обработался, но если у пришедшего процесса приоритет выше чем у выполняемого в данный момент, то выполнение процесса прекращается и начинает выполнятся процесс с высшим приоритетом.

Можно только назначить приоритет, а управлением потоками занимается система.


Digitman   (2005-06-21 14:26:00) [16]


> у пришедшего процесса


кто такой "пришедший процесс" ? куда он "ходил", откуда и куда "пришел" ?

у процесса как Win32-объекта есть строгое и четкое терминологическое определение ..

и причем здесь ФИФО ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо