Форум: "Прочее";
Текущий архив: 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