Вверх ↑
Ответов: 1429
Рейтинг: 50
#1: 2012-02-17 22:28:34 ЛС | профиль | цитата
nesco, под мою задачу подходит. Потому, что у меня любой обьект моей программы - это массив. Массив разделен минимум на два типа свойств: аудио и графика. Это значит, что графика никогда не полезет чего-то писать в звук и наоборот. Но при этом и аудио и интерфейс должны работать одновременно. Если использую критические секции - скорость упадет, массив обьекта-то один. Если начну удваивать количество массивов отдельно для графики и отдельно для звука, и для других сущностей(миди, автоматизации, и т. д.) - вырастет сложность моих, и без того сложных, схем.

А так очень удобно, есть один обьект, в нем лежит сразу всё. Но разные потоки работают с разными его переменными. Супер, спасибо
------------ Дoбавленo в 20.01:
Как всегда, не могу разобраться с типами Delphi. Почему не работает, и как надо?


Add(MainForm,2953706,168,112)
{
link(onCreate,1669216:in1,[])
}
Add(InlineCode,1669216,231,126)
{
@Hint=#21:+ InterlockedExchange|
@Color=11184725
WorkPoints=#3:in1|
EventPoints=#4:out1|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|29:uses kol,Share,Debug,windows;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|14: i:LongWord;|16: //i:LongWord;|9: public|27: out1:THI_Event; //выход|3: |55: procedure in1(var Data:TData; index:word); // Вход 1|0:|4:end;|0:|14:implementation|0:|35:procedure THiAsmClass.in1; // Вsход|4: |5:begin|0:|17: //Inc(i, 1);|34: InterlockedExchangeAdd(i, 1);|43: //i := InterlockedExchangeAdd(pi, 1); |25: _hi_OnEvent(out1, i)|0:|4:end;|0:|0:|4:end.|0:|0:|0:|0:|0:|0:|0:|0:|0:|0:|0:|0:|0:|0:|0:|0:|0:|0:|0:|0:|
link(out1,2361771:doText,[])
AddHint(-51,51,125,13,@Hint)
}
Add(Label,2361771,294,126)
{
Left=180
Top=100
Font=[MS Sans Serif,18,0,0,1]
}



Тут у них LONG, но он тоже у меня не работает:
Функция InterlockedExchange сохраняет значение одной переменной в другой.

LONG InterlockedExchange(LPLONG Target, LONG Value)

Эта функция возвращает текущее значение переменной, на которую указывает параметр Target, и устанавливает значение этой переменной равным Value. Функция InterlockedExchangeAdd прибавляет второе значение к первому.

LONG InterlockedExchangeAdd(PLONG Addend, LONG Increment)

И тут:
http://www.freepascal.org/docs-html/rtl/system/interlockedexchange.html



Всё, разобрался. Помог FPC



------------ Дoбавленo в 22.28:
Пишут, что для использования этих функций надо делать "выравнивание данных". Иначе производительность падает от 2 до 100 раз.

Я измерил в Performance Monitor, получилось, что любая программа, написанная в HiAsm даже на чистом FTCG, из пары элементов for и memo, вызывает зашкаливание графика "обнаружения процессором невыровненных данных".

Кто нить знает как просто и быстро выравнивать? И как узнавать когда надо выравнивать а когда нет?
карма: 0

0