Сначала создайте планировщик (если вы не понимаете «диспетчер процессов» как то, что обычно называют «планировщиком».), Вы должны выбрать модель многозадачности, кооперативную или вытесняющую.Упреждающий может быть трудным - использовать какие-то прерывания и так далее ... может быть излишне сложным для школьного проекта.
Если вы не знаете, какую модель выбрать, я настоятельно рекомендую совместную многозадачность.Именно здесь каждый процесс занимает определенный небольшой промежуток времени, а затем сам возвращает управление планировщику - скажем, после прохождения одной итерации своего «основного цикла».Обычно выполняется главным циклом, вызывающим некую функцию «task ()» класса процесса, и задача (), заканчивающаяся «return», без выполнения длинных циклов.
Начинаем с модели"задачи / процесса".Должен ли он быть загружаемым (скажем, как общий объектный файл) или предопределенным при запуске (класс).Точка входа, постоянное хранилище состояний, подпрограмма «основного цикла» с конечным автоматом (обычно реализуемая как переключатель, который перемещается между различными состояниями).Задача работает путем многократного запуска процедуры «точки входа».
Скорее всего, будут реализованы следующие состояния:
- init, запускаемый при запуске, один раз
- idle - проверка запросов на активность, если их нет, возвращает управление
- различными «рабочими» состояниями.
После этого подготовьте динамическую очередь таких задач.Добавление, удаление, повторение, повышенный приоритет = вызов не в порядке и т. Д.«Планировщик» выполняет итерации по всем задачам и запускает «подпрограмму запуска» каждой из них.
Когда у вас есть все это готово, вы можете написать то, что обычно называют «диспетчером задач» - программой, которая редактируетсписок.Удалите программу из очереди, добавьте новую, измените приоритет, сделайте паузу и т. Д.
Чтобы помочь себе представить, вы обычно пишете:
int main()
{
do_something1();
do_something2();
}
void do_something1()
{
//initialize
...perform stuff
int x=0;
//main loop
do {
if(condition...) {
...perform stuff
} else {
...perform other stuff
blargh(x);
x++;
}
} while(!end);
//ending
//finish...
...mop up.
}
Что нужно написать:
int main()
{
//main loop
do {
do_something1();
do_something2();
} while(!global_end);
}
void do_something1()
{
static state_enum state = STATE_INI;
static int x=0;
switch(state)
{
case STATE_INI:
//initialize
...perform stuff
state = STATE_WORK1;
x=0;
break;
case STATE_WORK1:
//main loop, mode 1
...perform stuff
if(condition) state = STATE_WORK2;
if(condition2) state = STATE_END;
if(condition4) state = STATE_IDLE;
break;
case STATE_WORK2:
//main loop, mode 2
...perform stuff
blargh(x);
x++;
if(condition3) state = STATE_WORK1;
if(condition4) state = STATE_IDLE;
break;
case STATE_IDLE:
//do nothing
//don't do any stuff.
if(any_condition) state = STATE_WORK1;
break;
case STATE_END:
//finish...
...mop up.
break;
}
return;
}
... и ваш менеджер процессов заменит то, что составляет статические вызовы
do_something1();
do_something2();
, на динамический список функций для вызова.
написание, написаниеПриложения для системы упреждающего планирования намного проще, вы просто пишете их, как в первой версии, не беспокоясь о сохранении состояния между вызовами (static
), или возвращая управление, или сохраняя каждую инструкцию case короткой и приятной с очень короткой, если таковая имеетсяпетли внутри, раскручивая большие.Но написать сам планировщик, прервать программу и сохранить ее состояние, затем восстановить ее и возобновить с того места, где он прервался, намного, намного сложнее.