IPB
ЛогинПароль:

> Правила раздела!

1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!

> Параллельные процессы, Релизация параллельных процессов
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 10

Репутация: -  0  +


Народ, может подскажите как в паскале реализовать параллельные процессы... Например, надо чтобы 2 процедуры выполнялись одновременно, независимо друг от друга. Если так можно сделать толко через защищенный режим работы процессора, то опишите пожалуйста метод поподробнее...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






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

Учти, что пример действительно просто демонстративный. Всё это можно оптимизировать и ещё как.
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.03.2024 9:36
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name