Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как освободить память? OutOfMemoryException  
V
    Опции темы
agealex
Дата 19.6.2009, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 2.9.2007

Репутация: нет
Всего: нет



Приложение написано на 9ой студии framework 3.5 на КПК

Данная функция создает плеер записывает в него буфер и проигрывает,
проблема в неоднократном открывание больших фалов:

Код

using System;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using System.Media;
using System.IO;
using System.Runtime.InteropServices;

namespace ShowDialog
{
    class Audio
    {
        public SoundPlayer Player;

        public  FileStream FileStreamWav;
        private Stream SoundStream;

        public void PlaySound(int StartPosition, int StopPosition)
        {
            try
            {
                Player.Stream.Close();
                Player.Dispose();
                GC.Collect();
            }
            catch (Exception v)
            {
 
            }
            Player = new SoundPlayer();
            Player.Stream = new MemoryStream();
            int PlayingSoundSize = 0; // Размер тела wav файла
            byte[] DataLenArray;
           
            PlayingSoundSize = StopPosition - StartPosition;
            // Запись в заголовок информации о размере тела файла
            DataLenArray = BitConverter.GetBytes(PlayingSoundSize);
            DataLenArray.CopyTo(SoundBuffHeader, WavHeaderSize);
            DataLenArray = BitConverter.GetBytes(PlayingSoundSize + WavHeaderSize - WavHeaderBodyLenghSize);
            DataLenArray.CopyTo(SoundBuffHeader, WavHeaderBodyLenghSize);
            
            //Запись заголовка в проигрываемый файл
            Player.Stream.Position = 0;
            Player.Stream.Write(SoundBuffHeader, 0, SoundBuffHeader.Length);
            // Запись самого тела
            
            byte[] test = new byte[PlayingSoundSize];
            Player.Stream.SetLength(PlayingSoundSize);                                                              // <-----Возникает рандомом ТУТ!!

            FileStreamWav.Position = StartPosition + 40;
            FileStreamWav.Read(test, 0, PlayingSoundSize); // Весь файл кроме заголовка 

            Player.Stream.Write(test, 0, test.Length);                                                                 //  <------Или ТУТ!!

            Player.Stream.Position = 0;
            
            Player.Load();
            Player.Play();
        }
        //Остановка плеера
        public void StopPlaying()
        {
            Player.Stop();
            try
            {
                Player.Stream.Close();
                Player.Dispose();
                GC.Collect();
            }
            catch (Exception v)
            {

            }
        }
    }

Так как там постоянная нехватка памяти возникла ошибка : OutofMemoryException

Помогите люди добрые smile  Как от нее избавиться можно?

Для зависания достаточно дважды загрузить файл размером (как у меня 4001000 байт ну или примерно)



PM MAIL   Вверх
azesmcar
Дата 19.6.2009, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 6
Всего: 211



Можно раньше времени вызвать Garbage collector -а.
GC.Collect


Это сообщение отредактировал(а) azesmcar - 19.6.2009, 23:32
PM   Вверх
agealex
Дата 19.6.2009, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 2.9.2007

Репутация: нет
Всего: нет



И так раньше времени вызываю :(  Я сначала паузу врубаю а потом уже снова play

Это сообщение отредактировал(а) agealex - 19.6.2009, 23:36
PM MAIL   Вверх
azesmcar
Дата 19.6.2009, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 6
Всего: 211



Цитата(agealex @  19.6.2009,  23:35 Найти цитируемый пост)
И так раньше времени вызываю :( 

Извиняюсь, код не смотрел.
но тут есть проблема, Garbage collector удалит те обьекты, на которые у вас нет ссылок. А у вас все ссылки действительны.
Можно подробнее? Что, где и когда.
PM   Вверх
agealex
Дата 19.6.2009, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 2.9.2007

Репутация: нет
Всего: нет



Да все спасибо уже все нашел smile 

Код

private void MemoryClear()
        {
            try
            {

             

                Player.Stream.Close();//<<-- Ну это контрольный закрытие потока
                Player.Dispose(); // <<-- Ну а это контрольное закрытие плеера
   GC.SuppressFinalize(Player); //<-- Указать на удаление
                GC.Collect(); // <<-- Вызов коллектора
                long check3 = GC.GetTotalMemory(true); //<<-- А вот этим извращение узнаем используемое количество байт , но главное в нем 
   //параметр true - который говорит что бы подождали пока GC закончит свою работу, и тогда к концу этой функции память свободна 
//наконец :)
            }
            catch (Exception v)
            {

            }
        }

вот эту функцию вставляю и все пашет smile 

Может конечно и перестраховался конечно через чур, но береженного бог бережет  smile , да если можно как нить упростить  пишите мне инетересно  smile 

Да и azesmcar - спасибо за быструю помощь smile

Да если бы не на КПК можно было бы воспользоваться MemoryFailPoint  - в качестве проверки наличия свободного места

Это сообщение отредактировал(а) agealex - 20.6.2009, 00:40
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0454 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.