Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.02.24;
Скачать: CL | DM;

Вниз

Как сделать, чтобы много функций работало параллельно?   Найти похожие ветки 

 
Trial   (2008-01-19 04:54) [0]

В смысле съимитировать.

То есть, есть массив данных и куча функций. Каждая функция берёт данные из массива и возвращает данные в массив. Частота вызовов функций зависит от параметров в этом массиве данных.

Как сделать так, как будто это работает всё параллельно в реальном времени?
Какой самый лучший способ?


 
KilkennyCat ©   (2008-01-19 06:29) [1]

самый лучший - не в Делфи, и не на писи-эйти...


 
Trial   (2008-01-19 06:42) [2]

Надо на Дельфи.


 
Черный Шаман   (2008-01-19 07:07) [3]


> Trial   (19.01.08 06:42) [2]
>
> Надо на Дельфи.


Нити + критическая секция?


 
KilkennyCat ©   (2008-01-19 07:08) [4]

тогда нитями.
или, если надо совсем как будто, то можно просчитать по отдельности, а потом уже результаты вывести синхронно.


 
Alkid ©   (2008-01-19 11:44) [5]

Задача поставлена слишком расплывчато.
Сколько будет функций? Насколько будет продолжительным процесс рассчёта одной функции от взятия данных до размещения в массиве результата. Зависят ли вычисления одних функций от результатов работы других. Если зависят, то как и как они должны выстраиваться в цепочку вычислений.


 
Trial   (2008-01-20 05:22) [6]


> Alkid ©   (19.01.08 11:44) [5]
>
> Задача поставлена слишком расплывчато.
> Сколько будет функций?


Сколько пользователь захочет.


> Зависят ли вычисления одних функций от результатов работы
> других


Только от общего массива данных.


> Черный Шаман   (19.01.08 07:07) [3]
>
>
> > Trial   (19.01.08 06:42) [2]
> >
> > Надо на Дельфи.
>
>
> Нити + критическая секция?


Можно на пальцах объяснить? Попроще.


 
No_Dead ©   (2008-01-20 05:26) [7]

> [6] Trial   (20.01.08 05:22)


> Сколько пользователь захочет.

мне две таких проги заверните%>


 
Dmitry S ©   (2008-01-20 05:56) [8]

Смотри справку по

CreateThread
EnterCriticalSection

Только это не эффективно на однопроцессорной (одно ядерной) конфигурации. Точнее не эффективно в плане производительности.


 
TUser ©   (2008-01-20 10:29) [9]


> Смотри справку по

TThread


 
Черный Шаман   (2008-01-20 12:53) [10]


> Trial   (20.01.08 05:22) [6]
>
>
> Можно на пальцах объяснить? Попроще.


How do I employ Critical Sections to synchronize two or more threads accessing the same data.
http://www.delphicorner.f9.co.uk/articles/op4.htm


 
ketmar ©   (2008-01-20 17:02) [11]

ещё MREW"ы могут помочь.


 
Alkid   (2008-01-20 18:53) [12]


> Trial   (20.01.08 05:22) [6]
> Сколько пользователь захочет.

Так не бывает. Всегда существует оценка снизу и сверху, т.е. тот диапазон значений, который подразумевается основными сценариями использования программы.


> Только от общего массива данных.

Т.е. воспользуется ли одна функция результатами работы другой зависит только от того, успеет ли та другая свои вычисления положить в массив до начала работы первой? Т.е. намеренный race condition?


 
rts111 ©   (2008-01-21 03:30) [13]

Сделай что-то типа ботов каждого со своей процедурой и пускай они работают, или просто массив процедур, и менеджр этих самых ботов(или процедур).
И пусть этот менеджер запускает их ( можно пачками ) например, на Application.OnIdle.

Например:

type

TBot = class
 procedure BotProcedure; virtual;abstract;
end;

TBot_00 = class(TBot)
 procedure BotProcedure; override;
end;

TBot_01 = class(TBot)
 procedure BotProcedure; override;
end;

...

TBotManager = class
 Bots :array of TBot;
 procedure Add(...);
 procedure Run;
 ...
end;

...


 
Trial   (2008-01-21 04:41) [14]


> Dmitry S ©   (20.01.08 05:56) [8]
>
> Смотри справку по
>
> CreateThread
> EnterCriticalSection
>
> Только это не эффективно на однопроцессорной (одно ядерной)
> конфигурации. Точнее не эффективно в плане производительности.


Нужно, чтоб было эффективно. В общем без потоков.


> Т.е. воспользуется ли одна функция результатами работы другой
> зависит только от того, успеет ли та другая свои вычисления
> положить в массив до начала работы первой? Т.е. намеренный
> race condition?


Да. Там накапливание значений идёт или уменьшение. На единицу больше или на единицу меньше - не так важно.


> rts111 ©   (21.01.08 03:30) [13]


Как сделать, чтобы частота вызовов зависила от параметров массива?


 
rts111 ©   (2008-01-21 11:19) [15]


> > rts111 ©   (21.01.08 03:30) [13]
>
>
> Как сделать, чтобы частота вызовов зависила от параметров
> массива?


Нет, ты конкретизируй задачу, как там оно зависит. А так что я тебе подскажу.

Вот еще вариант:

...
var
ii :integer=0;

procedure Button1Click( Sender :TObject );
begin
BotManager.Enable := True;
while BotManager.Enable do
begin
 ii := (ii +1) mod Length( BotManager.Bots );
 BotManager.Bots[ii].BotProcedure;
 Sleep(1);
 Application.ProcessMessages;
end;
end;

procedure Button1Click( Sender :TObject ); // выключает
begin
BotManager.Enable := False;
end;


 
rts111 ©   (2008-01-21 11:36) [16]

Правка:

...
var
ii :integer=0;

procedure TForm1.Button1Click( Sender :TObject ); // включает
begin
BotManager.Enable := True;
while BotManager.Enable do
begin
 ii := (ii +1) mod Length( BotManager.Bots );
 BotManager.Bots[ii].BotProcedure;
 Sleep(1);
 Application.ProcessMessages;
end;
end;

procedure TForm1.Button2Click( Sender :TObject ); // выключает
begin
BotManager.Enable := False;
end;

...


 
rts111 ©   (2008-01-21 11:55) [17]


> rts111 ©   (21.01.08 11:36) [16]


Еще правка:

...

procedure TForm1.Button1Click( Sender :TObject ); // включает
begin

if BotManager.Enable then Exit;

BotManager.Enable := True;

while BotManager.Enable do
begin
 ii := (ii +1) mod Length( BotManager.Bots );
 BotManager.Bots[ii].BotProcedure;
 Sleep(1);
 Application.ProcessMessages;
end;

end;

...


 
Trial   (2008-01-22 06:04) [18]


> rts111 ©   (21.01.08 11:19) [15]
> Нет, ты конкретизируй задачу, как там оно зависит. А так
> что я тебе подскажу.


Через дополнительную функцию. Как напишут так и будет зависить.


>  Sleep(1);

Слип - это просто потеря времени. В общем так плохо.


 
rts111 ©   (2008-01-22 15:59) [19]


> Слип - это просто потеря времени. В общем так плохо.


Ну удали его тогда.



Страницы: 1 вся ветка

Текущий архив: 2008.02.24;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.027 c
6-1180940537
DVM
2007-06-04 11:02
2008.02.24
Винет поток на функции Socket().


15-1200686027
Palladin
2008-01-18 22:53
2008.02.24
вытесняющая многозадачность в windows


15-1200657798
Lip
2008-01-18 15:03
2008.02.24
Как на агнлийском будет


11-1183273464
Danger
2007-07-01 11:04
2008.02.24
Шрифт в зеркале


2-1201901798
Бэтман
2008-02-02 00:36
2008.02.24
Дата рождения