Вверх ↑
Этот топик читают: Гость
Разработчик
Ответов: 4698
Рейтинг: 426
#16: 2012-02-16 19:26:32 ЛС | профиль | цитата
login,
login писал(а):
return(onTerminated)

Что то мне подсказывает, там должно быть event(onTerminated)
return делает выход из функции с игнором всех последующий операторов.
карма: 10
0
Ответов: 1429
Рейтинг: 50
#17: 2012-02-17 15:54:57 ЛС | профиль | цитата
Assasin, это нижняя точка. Она вернет состояние "запущен поток или остановлен". Название onTerminated, случайно получило приставку on. Обьявлена она обычной переменной:

#hws
lng.decl_priv_var(onTerminated, 'integer')

Assasin писал(а):
return делает выход из функции с игнором всех последующий операторов.
- тогда понятно. Надо придумать что-то другое. Хотя, зря она так делает, пусть бы печатала до END





------------ Дoбавленo в 15.54:
Login писал(а):
Два потока не могут одновременно записать в один массив, будет ошибка, а прочитать они одновременно смогут?

nesco писал(а):
Смогут, но при наличии кртической секции -- не смогут

nesco, а если я каждую "функцию записи в массив" обрамлю в InterlockedExchangeAdd то смогут читать одновременно, а при записи ожидать друг друга?

Или может нет разницы с критической секцией, а мне просто достаточно не оборачивать функции чтения в защиту, и тогда они будут нагло лезть в защищенный ресурс и читать его. Поэтому второй вопрос, для понимания двух первых: защищается весь массив массивов? Или, выборочно, каждая его переменная отдельно?

почему-то я предполагаю, что при критической секции залочится весь массив, а при InterlockedExchange только конкретная переменная массива, что мне и нужно, так?
карма: 0

0
Ответов: 3889
Рейтинг: 362
#18: 2012-02-17 16:09:51 ЛС | профиль | цитата
login, не рекомендую допускать чтения массива из одного потока в процессе записи в него другим. То есть разделяйте всё кроме одновременного чтения. Дело в том, что в процессе записи может перераспределиться область памяти или смениться указатель и в лучшем случае прочтуться неверные данные, в худшем же будет фатальная для потока ошибка - попытка чтения недопустимого адреса.
карма: 1

1
Голосовали:login
Ответов: 1429
Рейтинг: 50
#19: 2012-02-17 16:15:40 ЛС | профиль | цитата
1nd1g0, спасибо, гляньте, пожалуйста, я там продолжил вопрос, по поводу того массив лочится или его перемнные? Просто если лочатся переменные, то это уже разные ресурсы и смещения не будет.

(просто везде пишут "ресурс", а я не понял, что есть ресурс массив или каждый его элемент)
карма: 0

0
Разработчик
Ответов: 26324
Рейтинг: 2147
#20: 2012-02-17 16:28:52 ЛС | профиль | цитата
login, если создать критическую секцию, то тот поток, который влез первым, захватит секцию и все доступные данные (читай "ресурсы"), заблокировав все остальные потоки
карма: 22

0
Ответов: 1429
Рейтинг: 50
#21: 2012-02-17 16:31:53 ЛС | профиль | цитата
nesco, книжка писала:
knigka.png

То есть блокируется не поток, а переменная массива? (в отличии от критической секции)
карма: 0

0
файлы: 1knigka.png [67.3KB] [221]
Разработчик
Ответов: 26324
Рейтинг: 2147
#22: 2012-02-17 16:56:08 ЛС | профиль | цитата
login писал(а):
То есть блокируется не поток, а переменная массива? (в отличии от критической секции)

Мне критические секции нравятся больше, тут гарантировано никто никуда не влезет без разрешения. Хотя для некоторых участков подойдет и блокировка переменных, если быть уверенным, что к этим данным будут грантировано лезть только определенные потоки, а не все подряд. Честно сказать, я с такой задачей не сталкивался -- защищать массивы в отдельности
карма: 22

1
Голосовали:login
Ответов: 1429
Рейтинг: 50
#23: 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
Ответов: 3889
Рейтинг: 362
#24: 2012-02-17 22:31:58 ЛС | профиль | цитата
login писал(а):
Кто нить знает как просто и быстро выравнивать? И как узнавать когда надо выравнивать а когда нет?

Выравнивать желательно всегда. Компиляторы при включенной оптимизации должны это делать сами, иначе приходится браться за ассемблер. Местные компиляторы слишком древние для того, чтобы оптимально выравнивать под современные процессоры (архитектура изменилась драматически), так что можете спокойно об этом забыть
карма: 1

0
Ответов: 1429
Рейтинг: 50
#25: 2012-02-17 22:35:29 ЛС | профиль | цитата
1nd1g00, Спасибо, Ok.

Пардон, простите, в Performance Monitor не на тот график глядел, потому, что нужный график прилип к нулю. Эти данные моей системе не доступны.
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#26: 2012-02-18 00:22:29 ЛС | профиль | цитата
login, а {$A-} {$A+}
KOL писал(а):
{$A-} // align off, otherwise code is not good

карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
1
Голосовали:login
Ответов: 1429
Рейтинг: 50
#27: 2012-02-18 06:59:27 ЛС | профиль | цитата
Tad, вот, что смог про это найти:

viravn1.png
viravn2.png

Пишут, что выравнивание включено по умолчанию.

А когда я ставлю в строку компилятора $A+ он вообще говорит
Fatal: File not found: '$A+.dpr'
Fatal: File not found: '{$A+}.dpr'
Может синтаксис не верный.

карма: 0

0
файлы: 2viravn1.png [45KB] [244], viravn2.png [70KB] [308]
Разработчик
Ответов: 26324
Рейтинг: 2147
#28: 2012-02-18 12:52:38 ЛС | профиль | цитата
login писал(а):
А когда я ставлю в строку компилятора $A+ он вообще говорит

Это в коде ставить надо, вместе со скобками
карма: 22

0
Ответов: 16884
Рейтинг: 1239
#29: 2012-02-18 15:01:05 ЛС | профиль | цитата
nesco, а в Kol-е в первых строках его письма установлено
{$A-} // align off, otherwise code is not good

карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Администрация
Ответов: 15295
Рейтинг: 1519
#30: 2012-02-18 15:44:29 ЛС | профиль | цитата
return это возврат значения функции и выход из нее
карма: 26
0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)