login писал(а):
return(onTerminated)Что то мне подсказывает, там должно быть event(onTerminated)
return делает выход из функции с игнором всех последующий операторов.
|
Разработчик
Ответов: 4698
Рейтинг: 426
|
|||
|
login,
login писал(а): return(onTerminated)Что то мне подсказывает, там должно быть event(onTerminated) return делает выход из функции с игнором всех последующий операторов. |
|||
| карма: 10 |
|
|
Ответов: 1429
Рейтинг: 50
|
|||
|
Assasin, это нижняя точка. Она вернет состояние "запущен поток или остановлен". Название onTerminated, случайно получило приставку on. Обьявлена она обычной переменной:
Assasin писал(а): return делает выход из функции с игнором всех последующий операторов.------------ Дoбавленo в 15.54: Login писал(а): Два потока не могут одновременно записать в один массив, будет ошибка, а прочитать они одновременно смогут?nesco писал(а): Смогут, но при наличии кртической секции -- не смогутnesco, а если я каждую "функцию записи в массив" обрамлю в InterlockedExchangeAdd то смогут читать одновременно, а при записи ожидать друг друга? Или может нет разницы с критической секцией, а мне просто достаточно не оборачивать функции чтения в защиту, и тогда они будут нагло лезть в защищенный ресурс и читать его. Поэтому второй вопрос, для понимания двух первых: защищается весь массив массивов? Или, выборочно, каждая его переменная отдельно? почему-то я предполагаю, что при критической секции залочится весь массив, а при InterlockedExchange только конкретная переменная массива, что мне и нужно, так? |
|||
| карма: 0 |
|
|
Ответов: 3889
Рейтинг: 362
|
|||
|
login, не рекомендую допускать чтения массива из одного потока в процессе записи в него другим. То есть разделяйте всё кроме одновременного чтения. Дело в том, что в процессе записи может перераспределиться область памяти или смениться указатель и в лучшем случае прочтуться неверные данные, в худшем же будет фатальная для потока ошибка - попытка чтения недопустимого адреса.
|
|||
| карма: 1 |
| ||
| Голосовали: | login |
|
Ответов: 1429
Рейтинг: 50
|
|||
|
1nd1g0, спасибо, гляньте, пожалуйста, я там продолжил вопрос, по поводу того массив лочится или его перемнные? Просто если лочатся переменные, то это уже разные ресурсы и смещения не будет.
(просто везде пишут "ресурс", а я не понял, что есть ресурс массив или каждый его элемент) |
|||
| карма: 0 |
|
|
Разработчик
Ответов: 26324
Рейтинг: 2147
|
|||
|
login, если создать критическую секцию, то тот поток, который влез первым, захватит секцию и все доступные данные (читай "ресурсы"), заблокировав все остальные потоки
|
|||
| карма: 22 |
|
|
Ответов: 1429
Рейтинг: 50
|
|||
|
nesco, книжка писала:
То есть блокируется не поток, а переменная массива? (в отличии от критической секции) |
|||
| карма: 0 |
| ||
| файлы: 1 | knigka.png [67.3KB] [221] |
|
Разработчик
Ответов: 26324
Рейтинг: 2147
|
|||
|
login писал(а): То есть блокируется не поток, а переменная массива? (в отличии от критической секции)Мне критические секции нравятся больше, тут гарантировано никто никуда не влезет без разрешения. Хотя для некоторых участков подойдет и блокировка переменных, если быть уверенным, что к этим данным будут грантировано лезть только определенные потоки, а не все подряд. Честно сказать, я с такой задачей не сталкивался -- защищать массивы в отдельности |
|||
| карма: 22 |
| ||
| Голосовали: | login |
|
Ответов: 1429
Рейтинг: 50
|
|||
|
nesco, под мою задачу подходит. Потому, что у меня любой обьект моей программы - это массив. Массив разделен минимум на два типа свойств: аудио и графика. Это значит, что графика никогда не полезет чего-то писать в звук и наоборот. Но при этом и аудио и интерфейс должны работать одновременно. Если использую критические секции - скорость упадет, массив обьекта-то один. Если начну удваивать количество массивов отдельно для графики и отдельно для звука, и для других сущностей(миди, автоматизации, и т. д.) - вырастет сложность моих, и без того сложных, схем.
А так очень удобно, есть один обьект, в нем лежит сразу всё. Но разные потоки работают с разными его переменными. Супер, спасибо ------------ Дoбавленo в 20.01: Как всегда, не могу разобраться с типами Delphi. Почему не работает, и как надо? Тут у них 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 |
|
|
Ответов: 3889
Рейтинг: 362
|
|||
|
login писал(а): Кто нить знает как просто и быстро выравнивать? И как узнавать когда надо выравнивать а когда нет?Выравнивать желательно всегда. Компиляторы при включенной оптимизации должны это делать сами, иначе приходится браться за ассемблер. Местные компиляторы слишком древние для того, чтобы оптимально выравнивать под современные процессоры (архитектура изменилась драматически), так что можете спокойно об этом забыть |
|||
| карма: 1 |
|
|
Ответов: 1429
Рейтинг: 50
|
|||
|
1nd1g00, Спасибо, Ok.
Пардон, простите, в Performance Monitor не на тот график глядел, потому, что нужный график прилип к нулю. Эти данные моей системе не доступны. |
|||
| карма: 0 |
|
|
Ответов: 16884
Рейтинг: 1239
|
|||
|
login, а {$A-} {$A+}
KOL писал(а): {$A-} // align off, otherwise code is not good |
|||
| карма: 25 |
| ||
| Голосовали: | login |
|
Ответов: 1429
Рейтинг: 50
|
|||
|
Tad, вот, что смог про это найти:
Пишут, что выравнивание включено по умолчанию. А когда я ставлю в строку компилятора $A+ он вообще говорит Fatal: File not found: '$A+.dpr' Fatal: File not found: '{$A+}.dpr' Может синтаксис не верный. |
|||
| карма: 0 |
| ||
| файлы: 2 | viravn1.png [45KB] [244], viravn2.png [70KB] [308] |
|
Разработчик
Ответов: 26324
Рейтинг: 2147
|
|||
|
login писал(а): А когда я ставлю в строку компилятора $A+ он вообще говоритЭто в коде ставить надо, вместе со скобками |
|||
| карма: 22 |
|
|
Ответов: 16884
Рейтинг: 1239
|
|||
|
nesco, а в Kol-е в первых строках его письма установлено
{$A-} // align off, otherwise code is not good |
|||
| карма: 25 |
|
|
Администрация
Ответов: 15295
Рейтинг: 1519
|
|||
|
return это возврат значения функции и выход из нее
|
|||
| карма: 26 |
|