А так очень удобно, есть один обьект, в нем лежит сразу всё. Но разные потоки работают с разными его переменными. Супер, спасибо
------------ Д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)
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, вызывает зашкаливание графика "обнаружения процессором невыровненных данных".
Кто нить знает как просто и быстро выравнивать? И как узнавать когда надо выравнивать а когда нет?



Поиск
Друзья
Администрация