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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Уменьшить объем памяти 
V
    Опции темы
CYBERDREAM
Дата 28.11.2007, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

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



Всем вновь добрый день. Вопрос общего характера можно сказать.
Программа конектится к считывающему устройству и читает данные с него в двух потоках, (главный поток не вмешивается). 
Так вот, при считывании прога набирает по 5-10кб в секунду. Через полчаса под 30 метров. получается через 10 часиков работы под 200 метров весить что ли.  Мало того, будет еще один считыватель, тогда под все 400 метров  smile меня не радует такое будущее. При остановке потоков обороты прекращает набирать, но не уменьшается.

Каким то образом можно решить проблему с этим? Сборщик мусора либо ничего не делает либо 200кб прибавляет 


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
Zakonnic
Дата 28.11.2007, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Ну, это по идее зависит от способа организации данных. Попробуй Dispose() явно вызывать у тех структур, куда ты пишешь данные. Либо юзать массивы фиксированного объема. Вот такой вот общий ответ на вопрос общего характера - контроль над структурами данных smile
--------------------
...и никогда не пишите в комментариях правду
PM MAIL ICQ   Вверх
CYBERDREAM
Дата 28.11.2007, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

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



структур 10-15, а массив один StringBuilder, фикисрованный. Ну  чтож, скоро протестим  smile 


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
CYBERDREAM
Дата 20.12.2007, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

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



вообщем это большая Ж***, все равно растет память. В консольной проге от производителя, для показа функциональности, память растет теми же темпамиsmile smile smile smile  (может они просто это не учитывали, для малых прог).
Какое же может быть решение люди??
P.S. надо будет на ночь оставить работать ноут, до скольки дорастет этот прирост.  smile 


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
mr.DUDA
Дата 20.12.2007, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



CYBERDREAM, поставить .NET Memory Profiler и посмотреть какие объекты создаются, как часто, и как долго остаются висеть. Там есть real-time таблица с количеством объектов по имени класса, кол-вом байт, кол-вом созданных в секунду и т.п.


--------------------
user posted image
PM MAIL WWW   Вверх
CYBERDREAM
Дата 20.12.2007, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

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



Thx. надеюсь решится этот вопросик smile 


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
tol05
Дата 20.12.2007, 14:15 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

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



не забывай обнулять ссылки на твои 
Цитата(CYBERDREAM @  28.11.2007,  13:35 Найти цитируемый пост)
структур 10-15

как только они перестают быть нужными. 

И для всех объектов типов, которые реализуют Dispose() и Close(), вызывай эти методы обязательно


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Dino99rus
Дата 20.12.2007, 22:49 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

 //подключения kernel32.dll для вызова функ. SetProcessWorkingSetSize которая определяет оптемальный размер выделяемой прогаммы памяти
        [DllImport("kernel32.dll")]
        public static extern bool SetProcessWorkingSetSize(IntPtr handle, int minimumWorkingSetSize, int maximumWorkingSetSize);
//в функции
 SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);   
 
попробуй это, мне помогло. Вычитал из одной статьи на gotdotnet.ru
PM MAIL   Вверх
CYBERDREAM
Дата 21.12.2007, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

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



tol05 увы не помогло. Но все равно признателен  smile 
Dino99rus Огромное человеческое спасибо, во первых при запуске окна, в котором считывание происходит, объем уменьшился на 10мб, при каждом считывании память аналогично очищается. Просто Супер, молодца  smile 
Ура товарищи, сделали  smile 

Всем спасибо  smile 

Это сообщение отредактировал(а) CYBERDREAM - 24.11.2010, 14:48


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
mr.DUDA
Дата 21.12.2007, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



Цитата(CYBERDREAM @  21.12.2007,  11:35 Найти цитируемый пост)
 во первых при запуске окна, в котором считывание происходит, объем уменьшился на 10мб, при каждом считывании память аналогично очищается.

Терзают смутные сомнения по поводу pagefile.sys, а не растёт ли он при этом?... Может и не растёт, но всё же интересно, это GC отрабатывает или просто память процесса сбрасывается в файл подкачки.


--------------------
user posted image
PM MAIL WWW   Вверх
CYBERDREAM
Дата 21.12.2007, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

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



pagefile.sys остается абсолютно неизменным. Может быть еще подвохи? smile 


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
stab
Дата 21.12.2007, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

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



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


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
CYBERDREAM
Дата 21.12.2007, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

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



Не весело  smile какое еще может быть решение? ибо иначе пока никак не получается 


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
stab
Дата 21.12.2007, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

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



для начала надо понять утечки это или нет, для этого нужен профайлер или обычные счётчики .NET CLR Memory из Performance Monitor. если утечки, то бороться; если нет, значит программа написана не подходящим образом и нуждаетя в оптимизации или .NET не подходящая платформа для данной программы.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
CYBERDREAM
Дата 21.12.2007, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

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



есть прога - для демонстрации считывания. Так же может и записывать данные в метки и т.д. При запуске 50мб весит. И приросит памяти аналогичный моему. Если остановить считывание то память не освобождается, возобновив считывание - вновь прирост.
Так же есть консольная прога написанная на плюсах с использованием библиотечки (собственно ее я и переделал на шарп) - так же дает прирост памяти. По идее это не моя ошибка. 


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
stab
Дата 21.12.2007, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

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



значит при считывании утечка, следи за потоком данных и смотри что не освобождается. может хэндлы какие потоков\файлов\событий, объёмы утечки как раз таки очень напоминают утечку хэндлов. и код давай. smile


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
CYBERDREAM
Дата 21.12.2007, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

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



Даю код 
Код

namespace PInvokeExample
{
    using System;
    // Нужно для получения доступа к типан PInvoke
    using System.Runtime.InteropServices;
    using System.Diagnostics;
    using System.Threading;
    using System.Text;
    public class PInvokeClient
    {
        public static IntPtr ptr;

        public static IntPtr _rebootNotification=CreateEvent(IntPtr.Zero, false, false, null);
        public static IntPtr _regulatoryRegionChangeNotification=CreateEvent(IntPtr.Zero, false, false, null);
        public static IntPtr _inventoryNotification=CreateEvent(IntPtr.Zero, false, false, null);

        public static int _rebootResultCode;
        public static int _regulatoryRegionResultCode;
        public static IntPtr _inventoryNtf;//=(IntPtr)Marshal.StructureToPtr(MAPI_DATA_INVENTORY_NTF,0,false);

        [DllImport("libMach1.dll")] 
        public static extern IntPtr MAPI_Connect(string host,int k,ref MAPI_CONNECT_ERROR sl);

        /// <summary>
        /// 
        /// </summary>
        /// <param name="Reader"></param>
        /// <returns></returns>
        [DllImport("libMach1.dll")]
        public static extern MAPI_DATA MAPI_BootModemCmd(IntPtr Reader);
        
        [DllImport("libMach1.dll")]
        public static extern void MAPI_FlushData(IntPtr Reader);
        
        [DllImport("libMach1.dll")]
        public static extern void MAPI_Free(IntPtr mem);

        [DllImport("libMach1.dll",EntryPoint="MAPI_Free")]
        public unsafe static extern void MAPI_Free_(ushort * mem);

        [DllImport("libMach1.dll")]
        public static extern MAPI_DATA MAPI_GetData(IntPtr Reader);

        [DllImport("libMach1.dll")]
        public static extern MAPI_DATA MAPI_SetRegulatoryRegionCmd(IntPtr Reader,ref MAPI_DATA_SET_REGULATORY_REGION_CMD command);

        [DllImport("libMach1.dll")]
        public static extern MAPI_DATA MAPI_InventoryCmd(IntPtr Reader,ref MAPI_DATA_INVENTORY_CMD command);

        [DllImport("my.dll")]
        public static extern void _epc(char[] buffer, IntPtr EPCData, UInt32 EPCLength);

        [DllImport("my.dll")]
        public static extern int Add(int a,int b);

        [DllImport("kernel32.dll",SetLastError=true,ExactSpelling=true)]
        public static extern Int32 WaitForSingleObject(IntPtr handle,Int32 mlsec);

        [DllImport("kernel32.dll")]
        static extern IntPtr CreateEvent(IntPtr lpEventAttributes, bool bManualReset, bool bInitialState, string lpName);

        [DllImport("kernel32.dll")]
        static extern bool SetEvent(IntPtr hEvent);

        static int Main()
        {
            ReaderConnect();
            if(ptr!=IntPtr.Zero)
            {
                Console.Write("Rebooting modem .");
                Thread t = new Thread(new ThreadStart(DataThread));
                if(t==null)
                    Console.WriteLine("Не удалось создать поток");
                t.Start(); 
                BootModem(ptr);
                
                SetRegulatoryRegion(2);
                StartInventory();
                //Console.WriteLine("add = "+Add(2,3));
                epc();
                return 1;
            }
            else
                return 0;
        }
        static int epc()
        {
            int i=0;
            while (ptr!=IntPtr.Zero )
            {

                WaitForSingleObject(_inventoryNotification, 99999);
                //int k=0;
                if (_inventoryNtf!=IntPtr.Zero)
                {
                    //Format the EPC
            
                    //char[] EPCString=new char[24];
                    //string EPCString="";
                    string temp="";
                    MAPI_DATA_INVENTORY_NTF _invent=(MAPI_DATA_INVENTORY_NTF)Marshal.PtrToStructure(_inventoryNtf,typeof(MAPI_DATA_INVENTORY_NTF));
                    unsafe
                    {
                        FormatEPC(ref temp,_invent.Epc,_invent.EpcLen);
                    }
                    MAPI_Free(_inventoryNtf);
                    if(_invent.EpcLen>0)
                    {
                        i++;
                        Console.WriteLine(i+")   antenna {0} >>      EPC: {1}",_invent.Antenna,temp);
                        unsafe
                        {
                            MAPI_Free_(_invent.Epc);
                        }
                        MAPI_Free(_inventoryNtf);
                        _inventoryNtf = IntPtr.Zero;
                    }
                }
            }
            return 0;
        }

        unsafe static void FormatEPC(ref string buffer, ushort * EPCData, UInt32 EPCLength)
        {
            if (0 == EPCLength)
            {
                buffer="Blank EPC";
            }
            else
            {
                UInt32 epcLenIter=0;
                ushort *epcIter = EPCData;
                string[]mas=new string[6];
                char[]m=new char[4];
                //Console.WriteLine("len: "+EPCLength);
                while (epcLenIter < EPCLength)
                {
                    //Console.WriteLine("-->"+String.Format("{0:X}",Int32.Parse(epcIter->ToString())));
                    mas[epcLenIter]=String.Format("{0:X4}",Int32.Parse(epcIter->ToString()));
                    epcLenIter++;
                    epcIter++;
                }
                buffer=mas[0]+"-"+mas[1]+"-"+mas[2]+"-"+mas[3]+"-"+mas[4]+"-"+mas[5];
            }
        }
        static void StartInventory()
        {
            MAPI_DATA_INVENTORY_CMD command=new MAPI_DATA_INVENTORY_CMD();
            MAPI_FlushData(ptr);
            MAPI_DATA response = MAPI_InventoryCmd(ptr, ref command);
            switch (response.Type)
            {
                case MAPI_DATA_TYPE.MAPI_DATA_TYPE_INVALID_COMMAND_NTF:
                {
                    MAPI_DATA_INVALID_COMMAND_NTF invalidCommand = 
                        (MAPI_DATA_INVALID_COMMAND_NTF)Marshal.PtrToStructure(response.Data,typeof(MAPI_DATA_INVALID_COMMAND_NTF));
                    Console.WriteLine("Received Invalid Command Notification while starting inventory\n");
                    Console.WriteLine("Reason Code = {0}, Reader State = {1}\n",invalidCommand.ReasonCode, invalidCommand.State);
                    //MAPI_Free(invalidCommand);
                    //exit(1);
                    break;
                }
                case MAPI_DATA_TYPE.MAPI_DATA_TYPE_INVENTORY_RSP:
                {
                    MAPI_DATA_INVENTORY_RSP inventoryResponse = 
                        (MAPI_DATA_INVENTORY_RSP)Marshal.PtrToStructure(response.Data,typeof(MAPI_DATA_INVENTORY_RSP));
                    byte resultCode = inventoryResponse.ResultCode;
                    //MAPI_Free(inventoryResponse);
                    if (0 != resultCode)
                    {
                        Console.WriteLine("Failed to start Inventory- Result Code = %d\n",resultCode);
                        //exit(1);
                        
                    }
                    break;
                }
            }
        }
        public static void BootModem(IntPtr ptr)
        {
            MAPI_FlushData(ptr);
            MAPI_DATA response=MAPI_BootModemCmd(ptr);
            MAPI_Free(response.Data);
            bool bootComplete = false;

            while(!bootComplete)
            {
                WaitForSingleObject(_rebootNotification,99999);
                //Console.WriteLine("-->>>WaitForSingleObject in BootModem is Complete");
                switch (_rebootResultCode)
                {
                    
                    case 0:
                    {
                        Console.Write("\nModem reboot successful\n");
                        bootComplete = true;
                        break;
                    }
                    case 1: //Boot in progress
                    {
                        Console.WriteLine("~"); //print out a dot to show boot progress
                        break;
                    }
                    case 2:
                    {
                        Console.WriteLine("Modem reboot failed: Invalid Firmware\n");
                        break;
                    }
                    case 3:
                    {
                        Console.WriteLine("Modem reboot failed: Hardware communication timeout\n");
                        break;
                    }
                    case 4:
                    {
                        Console.WriteLine("Modem reboot failed: Boot failed due to unknown hardware\n");
                        break;
                    }
                    default:
                    {
                        Console.WriteLine("Modem reboot failed: unspecified error code {0}",_rebootResultCode);
                        break;
                    }
                }
                if (0 != _rebootResultCode && 1 !=_rebootResultCode) 
                    Console.WriteLine("exit");
                //exit;    //exit if we have failed reboot

            }
        }
        static void DataThread()
        {
            while(ptr!=IntPtr.Zero)
            {
                MAPI_DATA ReturnedData = MAPI_GetData(ptr);
                //ReturnedData.Data=new IntPtr(3690448);
                switch(ReturnedData.Type)
                {
                    case MAPI_DATA_TYPE.MAPI_DATA_TYPE_BOOT_MODEM_NTF:
                    {
                        MAPI_DATA_BOOT_MODEM_NTF bootModemNtf=(MAPI_DATA_BOOT_MODEM_NTF)Marshal.PtrToStructure(ReturnedData.Data,typeof(MAPI_DATA_BOOT_MODEM_NTF));
                        
                        //save the reboot command result code
                        int _rebootResultCode = bootModemNtf.BootResultCode;
                        //Console.WriteLine("Code - > "+_rebootResultCode.ToString());
                        if (1 == _rebootResultCode)
                            Console.Write("."); //print a progress dot
                        else
                        {
                            SetEvent(_rebootNotification);
                            //ptr = IntPtr.Zero;
                            //Console.WriteLine("Закончили выполнять перезагрузку");
                        }
                        break;
                    }

                    case MAPI_DATA_TYPE.MAPI_DATA_TYPE_INVENTORY_NTF:
                    {
                        _inventoryNtf = ReturnedData.Data;
                        SetEvent(_inventoryNotification);
                        break;
                    }

                        /////////////////////////////////////////////////////
                        // Received Set Regulatory Region result notification
                        /////////////////////////////////////////////////////
                    case MAPI_DATA_TYPE.MAPI_DATA_TYPE_SET_REGULATORY_REGION_NTF:
                    {        
                        //Console.WriteLine("Free");
                        MAPI_DATA_SET_REGULATORY_REGION_NTF data=
                            (MAPI_DATA_SET_REGULATORY_REGION_NTF)Marshal.PtrToStructure(ReturnedData.Data,typeof(MAPI_DATA_SET_REGULATORY_REGION_NTF));

                        //data = (MAPI_DATA_SET_REGULATORY_REGION_NTF *)ReturnedData.Data;
            
                        //save the regulatory change request result code
                        int _regulatoryRegionResultCode = data.ResultCode;
                        //Free the returned data
                        MAPI_Free(ReturnedData.Data);
                        SetEvent(_regulatoryRegionChangeNotification);
                        break;
                    }

                        ////////////////////////////////////////////////////////
                        // Received Reader connection termination
                        ////////////////////////////////////////////////////////
                    case MAPI_DATA_TYPE.MAPI_DATA_TYPE_EMPTY:
                    {
                        Console.WriteLine("Data thread terminiating due to DLL Notification.\n");
                        //null out the reader handle- it's no longer valid
                        ptr = IntPtr.Zero;
                        break;
                    }
                    default:
                    {
                        if (ReturnedData.Data==IntPtr.Zero) 
                            MAPI_Free(ReturnedData.Data);
                        break;
                    }
                }
            }
            //AfxEndThread(0);
            //Notify thread is ending
            //SetEvent(_hDataThread->m_hThread);
            //return 0;
        }

        static void ReaderConnect()
        {
            MAPI_CONNECT_ERROR connectResult=new MAPI_CONNECT_ERROR();
            //Connect to Speedway Reader
            string _readerHost = "192.168.127.22";
            Console.WriteLine(_readerHost);
            //READER _reader=new READER();// = MAPI_Connect(_readerHost,0,ref connectResult);
            

            ptr=MAPI_Connect(_readerHost,0,ref connectResult);
            if(ptr==IntPtr.Zero)
            {
                Console.WriteLine("Подключение к считывателю не удалось");
                Console.WriteLine("Failed to connect Speedway Reader {0}",_readerHost);
                switch(connectResult.ErrorType)
                {
                    case MAPI_CONNECT_ERROR_TYPE.MAPI_CONNECT_ERROR_ADDRESS:
                    {
                        Console.WriteLine("The address is not valid.\n");
                        break;
                    }
                    case MAPI_CONNECT_ERROR_TYPE.MAPI_CONNECT_ERROR_CONNECTION:
                    {
                        Console.WriteLine("A connection could not be established.\n");
                        break;
                    }
                    case MAPI_CONNECT_ERROR_TYPE.MAPI_CONNECT_ERROR_BUSY_UNKNOWN:
                    {
                        Console.WriteLine("The Reader is currently busy with another unknown client.\n");
                        break;
                    }
                    case MAPI_CONNECT_ERROR_TYPE.MAPI_CONNECT_ERROR_BUSY_KNOWN:
                    {
                        Console.WriteLine("The Reader is currently busy with another known client.\n");
                        break;
                    }
                    default:
                    {
                        Console.WriteLine("Error code %d received.\n", connectResult.ErrorType);
                        break;
                    }
                }
            }
            else
            {
                Console.WriteLine("1>>Подключение к считывателю прошло успешно\n");
            }
        }
        static void SetRegulatoryRegion(short regulatoryRegion)
        {
            MAPI_FlushData(ptr);

            //Create the command structure and clear the memory
            MAPI_DATA_SET_REGULATORY_REGION_CMD command=new MAPI_DATA_SET_REGULATORY_REGION_CMD();
            //memset(ref command, 0,sizeof(command));

            //Set the required parameter
            command.RegulatoryRegion = regulatoryRegion;
            
            //Call the Reader and get the Response
            MAPI_DATA response=MAPI_SetRegulatoryRegionCmd(ptr,ref command);

            //Check for an Invalid Command Notification
            switch (response.Type)
            {
                case MAPI_DATA_TYPE.MAPI_DATA_TYPE_SET_REGULATORY_REGION_RSP:
                {    
                    IntPtr setRegulatoryRegionRsp = response.Data;
                    MAPI_DATA_SET_REGULATORY_REGION_RSP _setRegulatoryRegionRsp=(MAPI_DATA_SET_REGULATORY_REGION_RSP)Marshal.PtrToStructure(setRegulatoryRegionRsp,typeof(MAPI_DATA_SET_REGULATORY_REGION_RSP));
                    byte resultCode = _setRegulatoryRegionRsp.ResultCode;
                    MAPI_Free(setRegulatoryRegionRsp);
                    if (resultCode != 0)
                    {
                        Console.WriteLine("Regulatory Region {0} not supported. Result Code: {1}",regulatoryRegion, resultCode);
                        //return 0;
                    }
                    break;
                }
                case MAPI_DATA_TYPE.MAPI_DATA_TYPE_INVALID_COMMAND_NTF:
                {
                    IntPtr invalidCommand = response.Data;
                    MAPI_DATA_INVALID_COMMAND_NTF _invalidCommand=(MAPI_DATA_INVALID_COMMAND_NTF)Marshal.PtrToStructure(invalidCommand,typeof(MAPI_DATA_INVALID_COMMAND_NTF));
                    Console.WriteLine("Received Invalid Command Notification while setting regulatory Region {0}\n", regulatoryRegion);
                    Console.WriteLine("Reason Code = {0}, Reader State = {1}\n",_invalidCommand.ReasonCode , _invalidCommand.State);
                    MAPI_Free(invalidCommand);
                    //return 0;
                    break;
                }
                case MAPI_DATA_TYPE.MAPI_DATA_TYPE_EMPTY:
                {
                    Console.WriteLine("Received reader disconnect message while setting Regulatory Region\n");
                    //return 0;
                    break;
                }
                case MAPI_DATA_TYPE.MAPI_DATA_TYPE_SYSTEM_ERROR_NTF:
                {
                    IntPtr systemErrNtf=response.Data;
                    //MAPI_DATA_SYSTEM_ERROR_NTF *systemErrNtf = (MAPI_DATA_SYSTEM_ERROR_NTF *)response.Data;
                    MAPI_DATA_SYSTEM_ERROR_NTF _systemErrNtf=(MAPI_DATA_SYSTEM_ERROR_NTF)Marshal.PtrToStructure(systemErrNtf,typeof(MAPI_DATA_SYSTEM_ERROR_NTF));
                    Console.WriteLine("Received System Error while setting regulatory Region %d\n", regulatoryRegion);
                    Console.WriteLine("Error Code %d, reason %d", _systemErrNtf.ErrorCode, _systemErrNtf.SystemErrorReason);
                    MAPI_Free(systemErrNtf);
                    //return 0;
                    break;
                }
                default:
                {
                    Console.WriteLine("Unexpected response received from Reader when setting Regulatory Region. Message Type %d\n", response.Type);
                    //return 0;
                    break;
                }
            }


            WaitForSingleObject(_regulatoryRegionChangeNotification,99999);
            switch(_regulatoryRegionResultCode)
            {
                case 0: 
                {
                    Console.WriteLine("Regulatory Region Set Successfully\n");
                    break;
                }
                case 1:
                {
                    Console.WriteLine("Regulatory Region not set- no valid regulatory calibration\n");
                    break;
                }
                case 2:
                {
                    Console.WriteLine("Regulatory Region not set- error setting regulatory region\n");
                    break;
                }
                default:
                {
                    Console.WriteLine("Regulatory Region not set- unspecified error %d\n",_regulatoryRegionResultCode);
                    break;
                }
            }
            if (0 != _regulatoryRegionResultCode) 
                Console.WriteLine("Exit immediately if failed setting regulatory region\nВыход из регулировки");

        }

    }
}

Проверить увы смогу лишь на работе в понедельник если что. Домой девайс тащить гиблое дело smile 



--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
mr.DUDA
Дата 21.12.2007, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



CYBERDREAM, мемори профайлером ты давно бы уже нашёл где "течёт" память...  smile 


--------------------
user posted image
PM MAIL WWW   Вверх
stab
Дата 21.12.2007, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

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



ужос. smile  ты уверен что утечка не в libMach1.dll?


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
CYBERDREAM
Дата 22.12.2007, 01:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

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



stab : возможно там и есть утечка эта. Но если так, то проблему уже не решить по ходу. 

Mr. Duda пока не разрулил с профайлером, на выходных поштудирую что к чему, авось поможет


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
CYBERDREAM
Дата 24.12.2007, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

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



Убрал  SetProcessWorkingSetSize. 
Как ни странно, но когда объем занимаемой прогой памяти доходит до 21-22 метрах ( по крайней мере при нынешних настройках) сбрасывается до 12 и т.д. а бывает и раньше. Вообщем пока неясно, когда он освобождает ресурсы и какие
Но это только если запускать из Memory Profiler'a


Это сообщение отредактировал(а) CYBERDREAM - 24.12.2007, 11:35


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
CYBERDREAM
Дата 24.12.2007, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

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



Не знаю глюк мой, или бывают еще такие случаи, но факт остается фактом.
Если свернуть окно (в котором происходит считывание и вывод всех меток ) то размер выделяемой памяти доходит до 1,5-2,5 мегабайт!!!!! ну и дальше прирост происходит. Если развернуть то сразу прибавляется 1метр ну а дальше прирост. Вообщем сворачиваением можно сказать происходит сбор мусора, но не приятный способ конечно. 
   Кто то сталкивался с подобным? smile 


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
stab
Дата 24.12.2007, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

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



при сворачивании как раз происходит SetProcessWorkingSetSize, в майкрософте раньше думали, что раз свернул, то на скорость исполнения задачи пофик и можно освободить память, с приходом висты всё изменилось - память больше не ресурс, память - это кэш.  smile 

Цитата(CYBERDREAM @  24.12.2007,  14:47 Найти цитируемый пост)
Как ни странно, но когда объем занимаемой прогой памяти доходит до 21-22 метрах ( по крайней мере при нынешних настройках) сбрасывается до 12

ну вот значит и отлично всё, команда асинизаторов делает своё грязное дело.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
CYBERDREAM
Дата 24.12.2007, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

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



Цитата(stab @ 24.12.2007,  13:03)
при сворачивании как раз происходит SetProcessWorkingSetSize, в майкрософте раньше думали, что раз свернул, то на скорость исполнения задачи пофик и можно освободить память, с приходом висты всё изменилось - память больше не ресурс, память - это кэш.  smile 

Цитата(CYBERDREAM @  24.12.2007,  14:47 Найти цитируемый пост)
Как ни странно, но когда объем занимаемой прогой памяти доходит до 21-22 метрах ( по крайней мере при нынешних настройках) сбрасывается до 12

ну вот значит и отлично всё, команда асинизаторов делает своё грязное дело.

в случае падения до 12 метров, я оказывается тогда тоже сворачивал окошко  smile Тобишь пока только через SetProcessWorkingSetSize получается упаковать размерчик.
Команда асинизаторов - это что и для чего хотелось бы узнать.  smile 
В присоединенном файле - скрин с профайлера


Это сообщение отредактировал(а) CYBERDREAM - 24.12.2007, 14:02

Присоединённый файл ( Кол-во скачиваний: 27 )
Присоединённый файл  ScreenShot.JPG 35,36 Kb


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
mr.DUDA
Дата 24.12.2007, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



Вертикальные полоски на скрине - это сборки мусора (ассенизаторы smile). Цифрой наверху показано поколение, для которого собирается мусор.


--------------------
user posted image
PM MAIL WWW   Вверх
CYBERDREAM
Дата 25.12.2007, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I think, there4 I am
***


Профиль
Группа: Завсегдатай
Сообщений: 1096
Регистрация: 31.10.2006
Где: CyberLand

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



Всем спасибо. Пока что обойдусь с помощью
Код

    System.Diagnostics.Process mainProc=System.Diagnostics.Process.GetCurrentProcess();
    mainProc.MinWorkingSet=-1;
    mainProc.MaxWorkingSet=-1;

Кстати, если считыватель не видит в своем окружении никаких меток, то память не растет. smile 


--------------------
Ищем .Net, Java, Javascript разработчиков, Кипр, Лимассол. (знание английского необязательно)
Telegram, skype: kuchuk.artiom
PM MAIL WWW   Вверх
Bladerender
Дата 23.5.2009, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



попробуй делать считывание информации в Queue<T>. У нее есть два чудестных метода Enqueue() and Dequeue(). Поток, который тянет информацию вкидает эту информацию порциями (обьектами) в очередь. А метод, который что-то с этими данными что-то делает, запускай в паралельном потоке. Как только метод сделает деквае следующей порции инфы и метод обработки этих данных завершиться, ссылка на эту порцию данных пропадет и сборщик соберет ее в удобное для него время. 

                   свалка для сборщика                                                         Queue<T>
              /               ^ [1]              /     <------[2]-------- Dequeue() --- |   [3][4][5]    |       <---[6]------- Enqueue()



Это должно помочь.

Это сообщение отредактировал(а) Bladerender - 23.5.2009, 10:05
PM MAIL   Вверх
PashaPash
Дата 23.5.2009, 12:21 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

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



Bladerender, попробуй смотреть на даты сообщений.


--------------------
PM MAIL WWW   Вверх
Bladerender
Дата 23.5.2009, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



 smile  smile  smile  smile  smile Жесть. А как же она попала на первую страницу ??  smile  smile  smile  smile 
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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