Помощь - Поиск - Пользователи - Календарь
Полная версия: Параллельные процессы
Форум «Всё о Паскале» > Pascal, Object Pascal > Теоретические вопросы
serge2k
Народ, может подскажите как в паскале реализовать параллельные процессы... Например, надо чтобы 2 процедуры выполнялись одновременно, независимо друг от друга. Если так можно сделать толко через защищенный режим работы процессора, то опишите пожалуйста метод поподробнее...
Altair
Нет, можно и через реальный режим. На самом деле многозачности в паскале сделать невозможно! Когда называют многозадачность в Паскале, имеют ввиду псевдомногозадачность. Также, как не может компьютер получать случайные числа (только псевдослучайные).
А посмотреть хорошие примеры псевдомультизадачности, можно здесь:

http://pascal.sources.ru/multtask/index.htm

---------------
P.S. на вопрос я не ответил, просто ссылку кинул. smile.gif
BlackShadow
Самый простой способ реализации псевдомультизадачности приблизительно таков: создаётся 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.

Учти, что пример действительно просто демонстративный. Всё это можно оптимизировать и ещё как.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.