Самый простой способ реализации псевдомультизадачности приблизительно таков: создаётся n функций вида Function Fi:Boolean. Затем создаётся процедура типа Procedure Work, которая вызывает все функции из списка по-очереди, смотрит не вернула ли очередная функция False и, если так, то удаляет её из этого списка. Сами же функции при вызове отрабатывают какой-то свой кусочек и возвращают True, если они ещё не закончили, или False в противном случае. При повторном вызове функция просто возобнавляет процесс. Вот простой пример:
Код
Var
nf:Integer;
fRes:Integer;
Function Factorial:Boolean;
Begin
If nf=1 Then
Factorial:=False
Else
Begin
fRes:=fRes*nf;
Dec(nf);
Factorial:=True
End
End;
Var
dn:Integer;
dx:Integer;
dRes:Integer;
Function Degree:Boolean;
Begin
If dn=1 Then
Degree:=False
Else
Begin
dRes:=dRes*dx;
Dec(dn);
Degree:=True
End
End;
Type
TCallBack=Function:Boolean;
TCallBackData=Record
Fn:TCallBack;
NeedToCall:Boolean
End;
Const
CallBacks:Array[1..2] Of TCallBackData = ((Factorial,True),(Degree,True));
Procedure Work;
Var
Cont:Boolean;
i:Integer;
Begin
Cont:=True;
While Cont Do
Begin
Cont:=False;
For i:=1 To 2 Do
If CallBacks[i].NeedToCall Then
Begin
Cont:=True;
CallBacks[i].NeedToCall:=CallBacks[i].Fn
End
End
End;
Begin
ReadLn(nf);
ReadLn(x);
ReadLn(dn);
fRes:=1;
dRes:=1;
Work;
WriterLn(fRes);
WriteLn(dRes)
End.
Учти, что пример действительно просто демонстративный. Всё это можно оптимизировать и ещё как.