![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Смешанный алгоритм: 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-объекта есть строгое и четкое терминологическое определение ..
и причем здесь ФИФО ?