Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.11;
Скачать: CL | DM;

Вниз

Смешанный алгоритм: FIFO+абсолютный приоритет   Найти похожие ветки 

 
sergey_spy   (2005-06-21 14:23) [0]

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


 
Digitman ©   (2005-06-21 14:26) [1]


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


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

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

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


 
Eraser ©   (2005-06-21 14:34) [2]

sergey_spy   (21.06.05 14:23)

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

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

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


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

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


 
TUser ©   (2005-06-21 14:46) [4]

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

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


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

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

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


 
Digitman ©   (2005-06-21 15:37) [6]


> Sergey_spy   (21.06.05 15:31) [5]


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


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


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

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

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


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


> Digitman ©   (21.06.05 15:37)


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


 
TUser ©   (2005-06-21 15:47) [9]

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


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



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

n - приоритет

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

Так понятно?


 
TUser ©   (2005-06-21 16:36) [11]

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


 
pasha_golub ©   (2005-06-21 16:37) [12]

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


 
wal ©   (2005-06-21 16:55) [13]

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

С уважением

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


 
-=XP=- ©   (2005-06-21 17:11) [14]

Как-то так:

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;


 
-=XP=- ©   (2005-06-21 17:13) [15]

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


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


> TUser ©


> wal ©


> -=XP=- ©

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



Страницы: 1 вся ветка

Текущий архив: 2005.07.11;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.031 c
1-1118391928
Игорь Степанов
2005-06-10 12:25
2005.07.11
Чем заменить метод FloodFill, отсутствующий у QRDBChart.Canvas


14-1118575412
marina_sf
2005-06-12 15:23
2005.07.11
Подскажите код...


1-1119362853
markers
2005-06-21 18:07
2005.07.11
Реестр


1-1119514369
sofa
2005-06-23 12:12
2005.07.11
Как сделать службу


3-1117687243
john_mag
2005-06-02 08:40
2005.07.11
обработчик MouseToCall