TMemoryStream
Спасибо!
Работаю с TMemoryStream. Все хорошо, но хотелось, что бы быстрее работал сам класс. Есть ли что-нибудь подобное TMemoryStream, но работающее на много быстрее?
Спасибо!
Есть, как известно можно поток запустить непосредственно через API Windows, так сказать на прямую, что дасть небольшой выйгрыш в скорости:) А вообще непонятно почему именно Stream тебе нужен???
Есть, как известно можно поток запустить непосредственно через API Windows, так сказать на прямую, что дасть небольшой выйгрыш в скорости:) А вообще непонятно почему именно Stream тебе нужен???
Нужен, так как надо данные загонять из цикла,а количество проходов не известно. Потом эти данные читать из стрима и работать с ними дальше.
Нужен, так как надо данные загонять из цикла,а количество проходов не известно. Потом эти данные читать из стрима и работать с ними дальше.
Да ты че??? Что за данные? Почему нельзя использовать массивы, множества, мултимножества или туму подобное. TStream редназначен для хранения какой-то бинарной инфы в памяти, для ее последующей обработки, но это огромные массивы данных...
Да ты че??? Что за данные? Почему нельзя использовать массивы, множества, мултимножества или туму подобное. TStream редназначен для хранения какой-то бинарной инфы в памяти, для ее последующей обработки, но это огромные массивы данных...
Я работаю с саунд картой. Получаю от нее буфер данных, которые надо сохранять к примеру в массив... Но ведь пользователь произвольно останавливает запись сигнала, то есть нельзя сказать какого размера нужен массив, чтобы сохранить все данные, полученные из буфера какое-то количество раз...
Я не программер, поэтому с множествами и мультимножествами не знаком. Если нужно заранее задавать их размерность, то и это не подходит по той же причине, что и массив.
Если ты знаешь, как сделать побыстрее, то буду благодарен...
Я работаю с саунд картой. Получаю от нее буфер данных, которые надо сохранять к примеру в массив... Но ведь пользователь произвольно останавливает запись сигнала, то есть нельзя сказать какого размера нужен массив, чтобы сохранить все данные, полученные из буфера какое-то количество раз...
Я не программер, поэтому с множествами и мультимножествами не знаком. Если нужно заранее задавать их размерность, то и это не подходит по той же причине, что и массив.
Если ты знаешь, как сделать побыстрее, то буду благодарен...
Вот уже кое что. Массивы и т. п. тебе не подойдут. Дело в том, что TMemoryStream работает через API непосредственно с памятью, так что врядле ты найдешь что-то быстрее. Не знаю достаточно ли коректно Borland реализовала это, но есть мнения что Visual c++ делает это побыстрее. Надо пойти другим путем, дело в том, что все процессы имеют приоритет исполнения, что дает им разграниченный доступ к процу и памяти, вот например Explorer имеет выысокий приоритет и поэтому, в момент, когда ты например дергаешь мышкой, он сварачивает все остальные процессы и реагирует на это действие, все остальные программы имеют средний приоритет исполнения. Так вот, если в твоей проге создать еще один поток и дать ему более высокий приоритет, он будет работать значительно быстрее, а раз ты имеешь дело со звуковой картой, то тебе это просто необходимо сделать. Более подробно это описано в книге Рихтера - Создания Win32 приложений с учетом 64 битной архитектуры, книга просто чудо, правда примеры на С++, но да ничего там функции восновном API, так что и в Delphi называются так же как и в C:) Да и еще чуть не забыл, что б такие манипуляции выполнять, нужно иметь привелегии администратора(в NT подобных), и еще это нужно делать очень аккуратно...
Если нужно заранее задавать их размерность, то и это не подходит по той же причине, что и массив.
Все равно, выделить заранее достаточно большую область памяти - будет быстрее, чем увеличивать по десятку байт и копировать, если не влезает. Память ведь виртуальная - т. е. физически выделяется только при первом обращении к соотвествующей странице.
Вот уже кое что. Массивы и т. п. тебе не подойдут. Дело в том, что TMemoryStream работает через API непосредственно с памятью, так что врядле ты найдешь что-то быстрее. Не знаю достаточно ли коректно Borland реализовала это, но есть мнения что Visual c++ делает это побыстрее. Надо пойти другим путем, дело в том, что все процессы имеют приоритет исполнения, что дает им разграниченный доступ к процу и памяти, вот например Explorer имеет выысокий приоритет и поэтому, в момент, когда ты например дергаешь мышкой, он сварачивает все остальные процессы и реагирует на это действие, все остальные программы имеют средний приоритет исполнения. Так вот, если в твоей проге создать еще один поток и дать ему более высокий приоритет, он будет работать значительно быстрее, а раз ты имеешь дело со звуковой картой, то тебе это просто необходимо сделать. Более подробно это описано в книге Рихтера - Создания Win32 приложений с учетом 64 битной архитектуры, книга просто чудо, правда примеры на С++, но да ничего там функции восновном API, так что и в Delphi называются так же как и в C:) Да и еще чуть не забыл, что б такие манипуляции выполнять, нужно иметь привелегии администратора(в NT подобных), и еще это нужно делать очень аккуратно...
Я пытался делать отдельный thread, но там потом появляются новые сложности, так как когда его исполнение заканчивается, то все используемые переменные высвобождаются и обнуляются. Или там можно настроить, чтобы не происходило такого?
Я хочу делать обработку данных вне этого потока, в основном коде...
Спасибо.
Все равно, выделить заранее достаточно большую область памяти - будет быстрее, чем увеличивать по десятку байт и копировать, если не влезает. Память ведь виртуальная - т. е. физически выделяется только при первом обращении к соотвествующей странице.
И на сколько большую?
Я пытался делать отдельный thread, но там потом появляются новые сложности, так как когда его исполнение заканчивается, то все используемые переменные высвобождаются и обнуляются. Или там можно настроить, чтобы не происходило такого?
Я хочу делать обработку данных вне этого потока, в основном коде...
Спасибо.
Так, при создании потока объяви в нем глобальные переменные, в основном приложении первоначально создай поток так Create(true), что б он не стал сразу исполняться, как только его нужно использовать, то юзай Resume или Suspend, точно не помню вообщем не уничтожай его, а возобновляй и тогда находящиеся в нем данные не потеряются.(основы ООП) Делать такие манипуляции с данными вообще-то глупо в основном потоке процесса, а если по большому счету, то тут нужну создавать службу, так как поведение WinAPI к ней лучше в плане ресурсов, чем к обычному приложению.
И на сколько большую?
Это уже тебе виднее - в зависимости от ожидаемого (предполагаемого) объема данных. Например, сколько пользователь может "наговорить" минимально хотя бы в режиме тестирования?
Это уже тебе виднее - в зависимости от ожидаемого (предполагаемого) объема данных. Например, сколько пользователь может "наговорить" минимально хотя бы в режиме тестирования?
В том все и дело, что пользователь могет сколь угодно захотеть "наговорить"...
Так, при создании потока объяви в нем глобальные переменные, в основном приложении первоначально создай поток так Create(true), что б он не стал сразу исполняться, как только его нужно использовать, то юзай Resume или Suspend, точно не помню вообщем не уничтожай его, а возобновляй и тогда находящиеся в нем данные не потеряются.(основы ООП) Делать такие манипуляции с данными вообще-то глупо в основном потоке процесса, а если по большому счету, то тут нужну создавать службу, так как поведение WinAPI к ней лучше в плане ресурсов, чем к обычному приложению.
ОК, я попробую. Обращение с потоками я знаю, проблемой было сохранение данных после завершения потока.