Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2008.02.24;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.053 c
2-1201522928
BBCHa
2008-01-28 15:22
2008.02.24
Иконка и сервис


8-1174828087
KOSik
2007-03-25 17:08
2008.02.24
Скругление угла


2-1201546095
noi
2008-01-28 21:48
2008.02.24
перевести данные из pChar в array of Byte


15-1200760437
cartman315
2008-01-19 19:33
2008.02.24
Delphi и flash.ocx


2-1201687447
Wolf
2008-01-30 13:04
2008.02.24
подскажите функцию добавления косой черты к пути





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский