Текущий архив: 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.49 MB
Время: 0.039 c