Вверх ↑
Этот топик читают: Гость
Ответов: 1429
Рейтинг: 50
#16: 2011-10-04 23:31:31 ЛС | профиль | цитата
1nd1g0, но я тестирую секвенсоры с активным внутренним генератором.
карма: 0

0
файлы: 1midi_io1.rar [4.2KB] [60]
Ответов: 3889
Рейтинг: 362
#17: 2011-10-04 23:34:32 ЛС | профиль | цитата
Леонид писал(а):
слип не поможет

Я подозреваю, он про Sleep из kernel32.dll. Он-то поможет, но он до миллисекунд.

login писал(а):
У конкурентов миди занимает 0-0,1% проца.

Так они и таймер используют внешний, много раз встречал в программах опции: "Какой таймер использовать" - свой или внешний (например, от реальноговиртуального порта MIDI на звуковой карте), в детали не вдавался.
карма: 1

0
Ответов: 16884
Рейтинг: 1239
#18: 2011-10-04 23:45:08 ЛС | профиль | цитата
login писал(а):
Как будто интерфейсные точки между таймером и слипом мешают:

Ну и выкинь лишнее.
procedure THiAsmClass.do_in1;
begin
_hi_OnEvent(out1, Data);
_hi_OnEvent(out2, Data);
end;
"Растояние" между out1 и out2 <2 микросекунд.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 3889
Рейтинг: 362
#19: 2011-10-04 23:49:59 ЛС | профиль | цитата
login писал(а):
чуток не хватает точности

А ещё у Вас там ядро процессора подвисает на 0.5 мс каждую секунду. Особенно понравились ваши самодельные "хабы".

code_25360.txt

Индусы в шоке )
карма: 1

0
файлы: 1code_25360.txt [1.8KB] [62]
Ответов: 16884
Рейтинг: 1239
#20: 2011-10-04 23:51:44 ЛС | профиль | цитата
Или даже так
procedure THiAsmClass.do_in1;
begin
_hi_OnEvent(out1, ');
_hi_OnEvent(out2, ');
end;
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
1
Голосовали:login
Ответов: 1429
Рейтинг: 50
#21: 2011-10-05 00:02:40 ЛС | профиль | цитата
[offtop]1nd1g0, да уж, эти хабы очень быстрые, индусы мне завидуют [/offtop]
1nd1g0, а зачем нужна эта защита ресурсов, что она делает?

Tad, да, убрал, спасибо.
карма: 0

0
Ответов: 3889
Рейтинг: 362
#22: 2011-10-05 00:05:55 ЛС | профиль | цитата
[offtop]
login писал(а):
эти хабы очень быстрые, индусы мне завидуют

Я не про Вас, а про таймеры со "сдвигом по фазе" (первым удивлюсь, если будут работать как должно в теории).[/offtop]

login писал(а):
зачем нужна эта защита ресурсов, что она делает?

Каждый таймер порождает независимый поток, исключаем потенциальные конфликты, только я забыл отключить ожидание в свойствах:

code_25361.txt
карма: 1

1
файлы: 1code_25361.txt [1.8KB] [62]
Голосовали:login
Ответов: 1429
Рейтинг: 50
#23: 2011-10-05 00:19:26 ЛС | профиль | цитата
[offtop]1nd1g0,

code_25362.txt
Но данные эти хабы не кешируют [/offtop]
карма: 0

0
файлы: 1code_25362.txt [1.6KB] [96]
Ответов: 3889
Рейтинг: 362
#24: 2011-10-05 00:21:37 ЛС | профиль | цитата
login, кстати, меня что-то берут сомнения, что программы "конкурентов" шлют всё короткими сообщениями MIDI. Гораздо целесообразнее им была бы потоковая передача, пакетами. Кстати, BASS может поддерживать то, чего не реализовано в компонентах (тоже пока не интересовался).
карма: 1

0
Ответов: 1429
Рейтинг: 50
#25: 2011-10-05 01:05:35 ЛС | профиль | цитата
1nd1g0, да, у bass я искал именно в хелпе ко всей их библиотеке, но не смог найти потоков миди.
Плюс я буду использовать bass ASIO, а не обычную bass.dll.
------------ Дoбавленo в 01.00:
1nd1g0, два таймера работают ровнее.
------------ Дoбавленo в 01.05:
индусский код победил ))
карма: 0

0
Ответов: 3889
Рейтинг: 362
#26: 2011-10-05 02:04:11 ЛС | профиль | цитата
1nd1g0 писал(а):
первым удивлюсь, если будут работать

login писал(а):
индусский код победил

Как и обещал, удивляюсь:

Кстати, при включенных таймерах, к элементам, подключенным после SafeMode, желательно обращаться только через SafeMode.WaitMode=Wait, это убережёт программу от критических ошибок и гарантированно запишетпрочтёт данные. Другой способ - обращаться только при остановленных таймерах.
карма: 1

0
Ответов: 1429
Рейтинг: 50
#27: 2011-10-05 20:48:01 ЛС | профиль | цитата
1nd1g0 писал(а):
обращаться только через SafeMode.WaitMode=Wait

Если мне надо узнать значение счетчика то так?
code_25377.txt
карма: 0

0
файлы: 1code_25377.txt [1.7KB] [56]
Ответов: 3889
Рейтинг: 362
#28: 2011-10-05 21:05:13 ЛС | профиль | цитата
login писал(а):
узнать значение счетчика

Да, абсолютно верно, только FT-компоненты вне FT-контейнера не должны работать, и нужно понимать, что на опрос счётчика времени остаётся ровно между завершением одного "такта" (События таймера и ветки, его обрабатывающей, вплоть до самого её конца) и наступлением следующего. Кроме того, если такт произойдёт на момент опроса счётчика, то он будет пропущен. Можно, конечно, всем включить режим Wait (расплатой за это будет повышение шансов полной рассинхронизации, если такты лавинообразно будут выполняться дольше 500 мкс - наступит цепочка блокировок, начнётся серьёзный сдвиг по фазе и накопление неотработавших тактов в очереди, вероятно переполнение и... В общем, действуйте с умом.
------------ Дoбавленo в 21.02:
Чтобы нивелировать эффект от пропуска тактов можно зарегистрировать не два, а четыре таймера, парами, запущенными со смещением, немного превышающим максимальное чтение счётчика по времени, режим - NoWait. Тогда вероятность, что хотя бы один из пары сработает, резко возрастёт.
------------ Дoбавленo в 21.05:
Если хотим точности, то можно потратить некоторое время на автокалибровку программы - самостоятельный замер всех задержек и подгонка таймеров на конкретном ПК в конкретном режиме (мало ли, экономия энергии включится или конкурентный режим ядра процессора ОС реализует). Это самый профессиональный вариант, но работы потребуется немало
карма: 1

0
Ответов: 1429
Рейтинг: 50
#29: 2011-10-05 21:47:24 ЛС | профиль | цитата
1nd1g0,
1nd1g0 писал(а):
четыре таймера
идея хорошая. Да, разсинхронизация не приемлема. Но только я доконца не понимаю:
1nd1g0 писал(а):
запущенными со смещением, немного превышающим максимальное чтение счётчика
.

1nd1g0 писал(а):
профессиональный вариант

Как раз об этом вчера думал, не мог уснуть. Еще мои таймеры будут вызывать события в отдельных потоках типа:
code_25381.txt
Это тоже надо делать как-то защищенно?


карма: 0

0
файлы: 1code_25381.txt [2KB] [62]
Ответов: 3889
Рейтинг: 362
#30: 2011-10-05 22:00:00 ЛС | профиль | цитата
login писал(а):
мои таймеры будут вызывать события в отдельных потоках

Ни в коем случае так не делайте. У SafeMode есть свойство Name, по сути это - имя группы. Я, кстати, это всё описал в справке по компоненту: SafeMode.
Элементы из группы с одним именем блокируют друг друга, так что одномоментно исполняется только один какой-нибудь участок. Так, как делаете Вы, поступать чревато. Один поток может начать, например, заполнять массив, выделит память под структуру с указателем, но будет прерван системой и управление попадёт второму потоку, который, скажем, читает из этого массива, берёт элемент, считывает указатель, а туда ещё не успели записать значение, он обращается по адресу 0 (или что там за мусор лежал в этой ячейке памяти - не знает никто), система завершает поток или всё приложеие с критической ошибкой попытки доступа к чужой памяти, оно Вам нужно?
карма: 1

1
Голосовали:login
Сообщение
...
Прикрепленные файлы
(файлы не залиты)