Перейти к содержимому


Фото

Приложение для работы с микрофоном. Кончается память!!! Только не понятно какая...


  • Чтобы отвечать, сперва войдите на форум
8 ответов в теме

#1 McCobra

McCobra

    Newbie

  • Members
  • Фишка
  • 11 Сообщений:

Опубликовано 30.01.2009 - 03:02

Добрый день, разрабатываю проект на ms vs2005 MFC. Программа через Multi-Media API работает со звуком, точнее получает данные с микрофона, полученные данные обрабатываются и уничтожаются, т.е. они никуда не сохраняются. Обнаружился интересный эффект при тестировании: программа перестаёт получать данные с микрофона через 5-6 минут работы, т.к. при попытке добавить в очередь новый буфер, система выдаёт ошибку Memory allocation error. наладонник не зависает, полностью работоспособен!
Но! При запуске других программ они либо совсем не работают либо сильно тормозят..
Данные с микрофона программа получает через оконное сообщение. После soft reset естесственно работоспособность сохраняется...Где собака порылась, Господа? Может кто сталкивался? И ещё. При обработке данных осуществляется графический вывод посредством компонента CDC.
dc=MainWnd->GetDC();
рисуем
MainWnd->ReleaseDC(dc);
dc-глобальная переменная.

Может ли граф вывод грешить?
Перерыл уже всё, память нигде не выделяется во время работы! Только под буферы в самом начале. Самое интересное! пробовал во время работы программы мониторить память с помощью GlobalMemoryStatus(). Смотрел сколько физической и виртуальной памяти осталось, результат - столько же сколько и в начале работы программы! Т.е. эта память не расходуется совсем, так и надо. Но тогда какой же чёрт побери памяти не хватает подсистеме при добавлении очередного буфера ф-ией waveInAddHeader() ??? Я уже и грешил на кучу, может кучи ей не хватает?? Пробовал выделять память и с помощью HeapAlloc() и GlobalAlloc() - результат одинаковый. Аппарат - HP 2495b, довольно мощный аппарат, 520MHz, 32 метра оперативы, WM5.0.

Всё перепробовал, проект надо доделывать а из заэтого он потерял работоспособность. Заранее благодарен за любую помощь!

#2 McCobra

McCobra

    Newbie

  • Members
  • Фишка
  • 11 Сообщений:

Опубликовано 30.01.2009 - 03:17

Путём ПОЛНОГО отключение посторонних функций кроме захвата аудио было выяснено что проблема в аудио захвате, работает 5 минут и Memory allocation error...



#3 Stas Pavlov

Stas Pavlov

    Advanced Member

  • Members
  • ФишкаФишкаФишка
  • 4 093 Сообщений:
  • МестоположениеМосква

Опубликовано 30.01.2009 - 16:28

Скроее всго кончаются виртуальное 32 Мб адрестной пространство выделяемое под каждый процесс. Надо смотреть на код. Если с кодом все в порядке - попробвать пропустить через Application Verifier -посмотреть, что он скажет.

#4 McCobra

McCobra

    Newbie

  • Members
  • Фишка
  • 11 Сообщений:

Опубликовано 31.01.2009 - 01:57

Возможно так и есть. Изменил способ выделения памяти на VirtualAlloc(), VirtualFree() соответственно. Действительно, во время работы проги теперь в статистике памяти видно как улетает виртуальная памяти. Но прикол в том, что получается что VirtualFree() ничего не освобождает!

Я её вызываю примерно так:

VirtualFree(m_Buf, BufferSize, MEM_RELEASE);

Где-то в чужих кодах встречал что вместо реального BufferSize при вызове VirtualFree() надо ставить 0, но не стал дальше разбираться. Сейчас потестю. А что есть Application Verifier?

#5 McCobra

McCobra

    Newbie

  • Members
  • Фишка
  • 11 Сообщений:

Опубликовано 31.01.2009 - 02:05

Тьфу млин, погнал про Verifier) Попробую. И всё же непонятно почему не освобождает VirtualFree()

#6 Stas Pavlov

Stas Pavlov

    Advanced Member

  • Members
  • ФишкаФишкаФишка
  • 4 093 Сообщений:
  • МестоположениеМосква

Опубликовано 02.02.2009 - 17:56

Выравнивание при выделеии функциями VirtualAllocXX 64Kb.

Как выделяли пямять до этого?

Ограничение на виртуальную память в слоте - 32 Мб.

#7 McCobra

McCobra

    Newbie

  • Members
  • Фишка
  • 11 Сообщений:

Опубликовано 04.02.2009 - 18:40

Вообщем тяжело, но кое-чего добился.

Добился того, что в эмуляторе с выставленными характеристиками аппарата програ работает бесконечно, т.е память никуда не утекает, всё супер. На аппарате работает минут 20 и потом ошибка выделения памяти выдаётся звуковой подсистемой винды. Добился вот как: ОДИН РАЗ В НАЧАЛЕ программы выделил с помощью VirtualAlloc() память для всего что мне нужно и затем ничего нигде не уничтожал и не выделял заново! Возможно это глюк но опытным путём выяснилось что VirtualFree() ничего не освобождает! Т.е. статистика виртуальной памяи в диспетчере памяти не меняется при вызове VirtualFree(), а при вызове VirtualAlloc() кол-во свободной памяти показываемое в диспетчере естесственно уменьшается))

В результате, при работе проги сейчас вирт память=const, никуда не девается, но через 20 мин работы ошибка выделдения памяти...... Скорее всего это чисто аппаратный глюк звуковой системы аппарата, больше грешить не на что!

#8 Stas Pavlov

Stas Pavlov

    Advanced Member

  • Members
  • ФишкаФишкаФишка
  • 4 093 Сообщений:
  • МестоположениеМосква

Опубликовано 04.02.2009 - 18:53

Да, это похоже на проблемы в драйверах.

Пробовали на других реальных устройствах?

#9 McCobra

McCobra

    Newbie

  • Members
  • Фишка
  • 11 Сообщений:

Опубликовано 05.02.2009 - 01:12

Нет не пробовал, есть в распоряжении ещё hp rxXXXX старенький с wm2003, но там проц слабенький 200 с копейками MHz, а прога работает активно с математикой, преобразования Фурье итп.. На моём стоит камень 520Mhz, справляется) Пыхтит но справляется))) Ээх.. Видимо Господа из ХьюлитПаккард где то ошиблися)) Спасибки за советы!




0 пользователей читают эту тему

0 members, 0 guests, 0 anonymous users