Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

TMemoryStream

12K
03 августа 2005 года
Nuken
8 / / 03.08.2005
Работаю с TMemoryStream. Все хорошо, но хотелось, что бы быстрее работал сам класс. Есть ли что-нибудь подобное TMemoryStream, но работающее на много быстрее?
Спасибо!
373
06 августа 2005 года
unmoved
216 / / 28.11.2004
Цитата:
Originally posted by Nuken
Работаю с TMemoryStream. Все хорошо, но хотелось, что бы быстрее работал сам класс. Есть ли что-нибудь подобное TMemoryStream, но работающее на много быстрее?
Спасибо!


Есть, как известно можно поток запустить непосредственно через API Windows, так сказать на прямую, что дасть небольшой выйгрыш в скорости:) А вообще непонятно почему именно Stream тебе нужен???

12K
07 августа 2005 года
Nuken
8 / / 03.08.2005
Цитата:
Originally posted by unmoved
Есть, как известно можно поток запустить непосредственно через API Windows, так сказать на прямую, что дасть небольшой выйгрыш в скорости:) А вообще непонятно почему именно Stream тебе нужен???



Нужен, так как надо данные загонять из цикла,а количество проходов не известно. Потом эти данные читать из стрима и работать с ними дальше.

373
07 августа 2005 года
unmoved
216 / / 28.11.2004
Цитата:
Originally posted by Nuken
Нужен, так как надо данные загонять из цикла,а количество проходов не известно. Потом эти данные читать из стрима и работать с ними дальше.



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

12K
08 августа 2005 года
Nuken
8 / / 03.08.2005
Цитата:
Originally posted by unmoved
Да ты че??? Что за данные? Почему нельзя использовать массивы, множества, мултимножества или туму подобное. TStream редназначен для хранения какой-то бинарной инфы в памяти, для ее последующей обработки, но это огромные массивы данных...



Я работаю с саунд картой. Получаю от нее буфер данных, которые надо сохранять к примеру в массив... Но ведь пользователь произвольно останавливает запись сигнала, то есть нельзя сказать какого размера нужен массив, чтобы сохранить все данные, полученные из буфера какое-то количество раз...
Я не программер, поэтому с множествами и мультимножествами не знаком. Если нужно заранее задавать их размерность, то и это не подходит по той же причине, что и массив.
Если ты знаешь, как сделать побыстрее, то буду благодарен...

373
08 августа 2005 года
unmoved
216 / / 28.11.2004
Цитата:
Originally posted by Nuken
Я работаю с саунд картой. Получаю от нее буфер данных, которые надо сохранять к примеру в массив... Но ведь пользователь произвольно останавливает запись сигнала, то есть нельзя сказать какого размера нужен массив, чтобы сохранить все данные, полученные из буфера какое-то количество раз...
Я не программер, поэтому с множествами и мультимножествами не знаком. Если нужно заранее задавать их размерность, то и это не подходит по той же причине, что и массив.
Если ты знаешь, как сделать побыстрее, то буду благодарен...


Вот уже кое что. Массивы и т. п. тебе не подойдут. Дело в том, что TMemoryStream работает через API непосредственно с памятью, так что врядле ты найдешь что-то быстрее. Не знаю достаточно ли коректно Borland реализовала это, но есть мнения что Visual c++ делает это побыстрее. Надо пойти другим путем, дело в том, что все процессы имеют приоритет исполнения, что дает им разграниченный доступ к процу и памяти, вот например Explorer имеет выысокий приоритет и поэтому, в момент, когда ты например дергаешь мышкой, он сварачивает все остальные процессы и реагирует на это действие, все остальные программы имеют средний приоритет исполнения. Так вот, если в твоей проге создать еще один поток и дать ему более высокий приоритет, он будет работать значительно быстрее, а раз ты имеешь дело со звуковой картой, то тебе это просто необходимо сделать. Более подробно это описано в книге Рихтера - Создания Win32 приложений с учетом 64 битной архитектуры, книга просто чудо, правда примеры на С++, но да ничего там функции восновном API, так что и в Delphi называются так же как и в C:) Да и еще чуть не забыл, что б такие манипуляции выполнять, нужно иметь привелегии администратора(в NT подобных), и еще это нужно делать очень аккуратно...

10
08 августа 2005 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by Nuken
Если нужно заранее задавать их размерность, то и это не подходит по той же причине, что и массив.


Все равно, выделить заранее достаточно большую область памяти - будет быстрее, чем увеличивать по десятку байт и копировать, если не влезает. Память ведь виртуальная - т. е. физически выделяется только при первом обращении к соотвествующей странице.

12K
08 августа 2005 года
Nuken
8 / / 03.08.2005
Цитата:
Originally posted by unmoved
Вот уже кое что. Массивы и т. п. тебе не подойдут. Дело в том, что TMemoryStream работает через API непосредственно с памятью, так что врядле ты найдешь что-то быстрее. Не знаю достаточно ли коректно Borland реализовала это, но есть мнения что Visual c++ делает это побыстрее. Надо пойти другим путем, дело в том, что все процессы имеют приоритет исполнения, что дает им разграниченный доступ к процу и памяти, вот например Explorer имеет выысокий приоритет и поэтому, в момент, когда ты например дергаешь мышкой, он сварачивает все остальные процессы и реагирует на это действие, все остальные программы имеют средний приоритет исполнения. Так вот, если в твоей проге создать еще один поток и дать ему более высокий приоритет, он будет работать значительно быстрее, а раз ты имеешь дело со звуковой картой, то тебе это просто необходимо сделать. Более подробно это описано в книге Рихтера - Создания Win32 приложений с учетом 64 битной архитектуры, книга просто чудо, правда примеры на С++, но да ничего там функции восновном API, так что и в Delphi называются так же как и в C:) Да и еще чуть не забыл, что б такие манипуляции выполнять, нужно иметь привелегии администратора(в NT подобных), и еще это нужно делать очень аккуратно...



Я пытался делать отдельный thread, но там потом появляются новые сложности, так как когда его исполнение заканчивается, то все используемые переменные высвобождаются и обнуляются. Или там можно настроить, чтобы не происходило такого?
Я хочу делать обработку данных вне этого потока, в основном коде...
Спасибо.

12K
08 августа 2005 года
Nuken
8 / / 03.08.2005
Цитата:
Originally posted by Freeman
Все равно, выделить заранее достаточно большую область памяти - будет быстрее, чем увеличивать по десятку байт и копировать, если не влезает. Память ведь виртуальная - т. е. физически выделяется только при первом обращении к соотвествующей странице.



И на сколько большую?

373
08 августа 2005 года
unmoved
216 / / 28.11.2004
Цитата:
Originally posted by Nuken
Я пытался делать отдельный thread, но там потом появляются новые сложности, так как когда его исполнение заканчивается, то все используемые переменные высвобождаются и обнуляются. Или там можно настроить, чтобы не происходило такого?
Я хочу делать обработку данных вне этого потока, в основном коде...
Спасибо.


Так, при создании потока объяви в нем глобальные переменные, в основном приложении первоначально создай поток так Create(true), что б он не стал сразу исполняться, как только его нужно использовать, то юзай Resume или Suspend, точно не помню вообщем не уничтожай его, а возобновляй и тогда находящиеся в нем данные не потеряются.(основы ООП) Делать такие манипуляции с данными вообще-то глупо в основном потоке процесса, а если по большому счету, то тут нужну создавать службу, так как поведение WinAPI к ней лучше в плане ресурсов, чем к обычному приложению.

10
08 августа 2005 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by Nuken
И на сколько большую?


Это уже тебе виднее - в зависимости от ожидаемого (предполагаемого) объема данных. Например, сколько пользователь может "наговорить" минимально хотя бы в режиме тестирования?

12K
09 августа 2005 года
Nuken
8 / / 03.08.2005
Цитата:
Originally posted by Freeman
Это уже тебе виднее - в зависимости от ожидаемого (предполагаемого) объема данных. Например, сколько пользователь может "наговорить" минимально хотя бы в режиме тестирования?



В том все и дело, что пользователь могет сколь угодно захотеть "наговорить"...

12K
09 августа 2005 года
Nuken
8 / / 03.08.2005
Цитата:
Originally posted by unmoved
Так, при создании потока объяви в нем глобальные переменные, в основном приложении первоначально создай поток так Create(true), что б он не стал сразу исполняться, как только его нужно использовать, то юзай Resume или Suspend, точно не помню вообщем не уничтожай его, а возобновляй и тогда находящиеся в нем данные не потеряются.(основы ООП) Делать такие манипуляции с данными вообще-то глупо в основном потоке процесса, а если по большому счету, то тут нужну создавать службу, так как поведение WinAPI к ней лучше в плане ресурсов, чем к обычному приложению.



ОК, я попробую. Обращение с потоками я знаю, проблемой было сохранение данных после завершения потока.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог