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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Garbage Collector, запуск по требованию программы 
V
    Опции темы
tol05
Дата 11.7.2007, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Azzdorf @  11.7.2007,  22:40 Найти цитируемый пост)
 но не есть ли оптимальная робота программы с памятю - одним из столпов професионального программирования и создания ефективных преложений????  и стоит ли к этому стремится или это пустая трата времени???
я не говорил, что это не нужно или плохо smile Стремится надо? Значит будем  smile 

просто это - новый виток в бесконечной теме оптимизации ресурсов и производительности. Тут несколько типоков создать прийдется smile

mr.DUDA, массив - это класс. Вот и все. Классы тоже " не копируется при присвоении, собирается при уборке" и элементами классов тоже могут быть не ссылочные типы.
Точно так же, как элементами массива могут быть как ссылочные, так и типы по-значению.

Я бы сказал, что массив - просто про-про-паттерн  smile 



Это сообщение отредактировал(а) tol05 - 12.7.2007, 08:18


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


Кодю потиху
****


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

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



Давайте и я своих 5 копеек...


Почему никто не вспоминает про такие операции как запаковка и распаковка?
Именно таким образом значимые типы хранятся в куче. Т.е. у каждого Value-типа есть брат билзнец, который является ссылочным типом и храниться в куче.

Все остальное мои мысли и не могут считаться полностью достоверными.

Когда происходит эта распаковки и запаковка? А когда нужно что-то сделать со "значением", что не соответствует его типу, например:
Код

int i =0; // ссылка
i++; // Еще ссылка
Console.Write(i.ToString()) // Уже не ссылка (запаковка)

int j = i; // Скорее всего i опять стала ссылкой (распаковка), но кто ее знает :)


По поводу массивов. Лопатил как-то MSDN и набрел на такую штуку:
Цитата(http://msdn2.microsoft.com/en-us/library/6sh2ey19.aspx)

Performance Considerations

In deciding whether to use the List or ArrayList class, both of which have similar functionality, remember that the List class performs better in most cases and is type safe. If a reference type is used for type T of the List class, the behavior of the two classes is identical. However, if a value type is used for type T, you need to consider implementation and boxing issues.

If a value type is used for type T, the compiler generates an implementation of the List class specifically for that value type. That means a list element of a List object does not have to be boxed before the element can be used, and after about 500 list elements are created the memory saved not boxing list elements is greater than the memory used to generate the class implementation.

Make certain the value type used for type T implements the IEquatable generic interface. If not, methods such as Contains must call the Object.Equals method, which boxes the affected list element. If the value type implements the IComparable interface and you own the source code, also implement the IComparable generic interface to prevent the BinarySearch and Sort methods from boxing list elements. If you do not own the source code, pass an IComparer object to the BinarySearch and Sort methods


Т.е. List<T> where T:ValueType пытается храниться в стеке до тех пор пока его не станут использовать как класс (вызывать его методы, например. Хотя, судя по цитате, при вызове методов не всегда происходит запаковка) либо до тех пор пока его не целесообразнее положить в кучу.
Что-то похожее должно быть и про простой массив, но в MSDN я этого не нашел :(

Цитата(mr.DUDA @  11.7.2007,  22:38 Найти цитируемый пост)
Просто начав оптимизировать одну софтину, активно создающую тонны мелких объектов, пришёл к тому что можно объявить их структурами и хранить в пул

ИМХО, пул и структуры вещи совершенно несовместимые. Ибо при присваивании структуры создается новая копия.
Вот пул классов -- это да.
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 12.7.2007, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(ivashkanet @  12.7.2007,  09:45 Найти цитируемый пост)
ИМХО, пул и структуры вещи совершенно несовместимые. Ибо при присваивании структуры создается новая копия.

Оффтопик. Но отвечу. Для того чтобы не копировало, юзается ref при передаче через аргументы метода. Во всех остальных случаях юзается через массив по индексу (т.е. без копирования в локальную переменную).

Насчёт боксинга ты правильно заметил. Вот только вопрос про то почему стековая память называется такой, ею не являясь, остаётся открытым.


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


Кодю потиху
****


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

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



Цитата(mr.DUDA @  12.7.2007,  09:56 Найти цитируемый пост)
Оффтопик. Но отвечу. Для того чтобы не копировало, юзается ref при передаче через аргументы метода. Во всех остальных случаях юзается через массив по индексу (т.е. без копирования в локальную переменную).

Тогда да, но что-то через одно место получается как-то. Ее же, ИМХО, никак нельзя использовать вне массива (ни для каких вычислений). Ну да ладно 
PM MAIL WWW ICQ   Вверх
tol05
Дата 12.7.2007, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



mr.DUDA, с чего ты взял, что 
Цитата(mr.DUDA @  12.7.2007,  09:56 Найти цитируемый пост)
стековая память называется такой, ею не являясь
не мгу понять. Стековая память - это память, заполняемая при входе в функцию значениями и очищаемая после выхода из ф-ции.
Она при входе в ф-цию заполнилась value-типами и ссылками на reference-типы. При выходе из ф-ции она очистилась - value-типы и ссылки на reference-типы уничтожились. Сами reference-типы еще остались в куче, до сборки мусора.
Что не так?

Массив - это класс. Члены массива хранятся в куче. Ссылка на массив хранится в стеке.



--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
mr.DUDA
Дата 12.7.2007, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(tol05 @  12.7.2007,  10:08 Найти цитируемый пост)
Члены массива хранятся в куче. Ссылка на массив хранится в стеке.

Вообще запутал. Тут же себе противоречишь:

Цитата(tol05 @  12.7.2007,  10:08 Найти цитируемый пост)
Стековая память - это память, заполняемая при входе в функцию значениями и очищаемая после выхода из ф-ции.

Получается, ссылка на массив уничтожится при выходе из функции, раз она "хранится в стеке". Хотя даже если и наоборот (ссылка - в куче, элементы - в стеке), всё равно не вкуриваю, где на самом деле хранятся элементы массива. 
1. Если они не уничтожаются при выходе из метода - значит, вероятно не в стеке
2. Если они не боксятся и остаются нормальными value type (например int-ы), значит не в куче.

Или всё-таки в куче можно хранить value-type объекты без боксинга? Или массивы - специальный тип, как я предполагаю?

З.Ы
ivashkanet, если интересно могу прислать образец кода. Кстати, мелкомягкие в XNA вовсю юзают структуры, а чтобы не копировалось лишний раз зря - повсеместно юзают модификатор ref.


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


Кодю потиху
****


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

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



Цитата(mr.DUDA @  12.7.2007,  09:56 Найти цитируемый пост)
Вот только вопрос про то почему стековая память называется такой, ею не являясь, остаётся открытым. 

А что такое Стек, когда у нас есть только оперативная память?
Конечно это обычная оперативная память, только она специально организована. И, ИМХО, выигрыш идет не на порядок, а раза в два-три (ИМХО), так как в случае стека мы вигрываем из-за отстутствия сборок мусора и более простому доступу (адреса переменных в стеке должы быть поменьше), но проигрываем из-за этой "организованности" стека.

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

P.P.S. 
Цитата(tol05 @  12.7.2007,  10:08 Найти цитируемый пост)
Массив - это класс. Члены массива хранятся в куче. Ссылка на массив хранится в стеке.

Почитай мой пост про List<T> where T:ValueType

Добавлено через 14 минут и 49 секунд
Цитата(mr.DUDA @  12.7.2007,  10:14 Найти цитируемый пост)
ivashkanet, если интересно могу прислать образец кода. Кстати, мелкомягкие в XNA вовсю юзают структуры, а чтобы не копировалось лишний раз зря - повсеместно юзают модификатор ref. 

Не пасиб. Не нуна  smile 
Цитата(mr.DUDA @  12.7.2007,  10:14 Найти цитируемый пост)
Получается, ссылка на массив уничтожится при выходе из функции, раз она "хранится в стеке". Хотя даже если и наоборот (ссылка - в куче, элементы - в стеке), всё равно не вкуриваю, где на самом деле хранятся элементы массива. 

Не, все нормуль. Это нормальное поведение ссылочного типа: все ссылки на него теряются, а он все еще жив, но не долго -- до первой сборки мусора.

Только вот, судя по MSDN, небольшиуе массивы хранятся в стеке  smile 
PM MAIL WWW ICQ   Вверх
ivashkanet
Дата 12.7.2007, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


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

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



Цитата(mr.DUDA @  12.7.2007,  10:14 Найти цитируемый пост)
ivashkanet, если интересно могу прислать образец кода.

А хотя, пришли, плиз. Я хочу посмотреть. Только потрать немножко времени, выдели самое главное, пожайлуйста
PM MAIL WWW ICQ   Вверх
tol05
Дата 12.7.2007, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



mr.DUDA, я видел, ты иногда бросаешь ссылки на книгу "C#2005 для профессионалов". Открой стр. 102 
Цитата

Все массивы - ссылочные типы и следуют семантике ссылок....


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

Массив - это класс. Члены массива хранятся в куче. Ссылка на массив хранится в стеке.
Стековая память - это память, заполняемая при входе в функцию значениями и очищаемая после выхода из ф-ции.
Она при входе в ф-цию заполнилась value-типами и ссылками на reference-типы (в том числе и ссылкой на массив - переменная arrInt является ссылкой на массив, члены которого хранятся в куче). При выходе из ф-ции она очистилась - value-типы и ссылки на reference-типы уничтожились (в том числе, ячейка, хранящая адрес массива и называющаяся переменной arrInt). Сами reference-типы еще остались в куче, до сборки мусора (все ячейки, содержащие реальные значения элементов массива arrInt).


Цитата(mr.DUDA @  12.7.2007,  10:14 Найти цитируемый пост)
Если они не уничтожаются при выходе из метода - значит, вероятно не в стеке

конечно они не в стеке. Они в куче, а вот указатель на них (область памяти, выделенную для хранения их всех) - он как раз в стеке


Цитата(mr.DUDA @  12.7.2007,  10:14 Найти цитируемый пост)
Если они не боксятся и остаются нормальными value type (например int-ы), значит не в куче

Я предлагаю вообще никому про боксинг не упоминать. Это только путает. 
Боксинг для того, чтобы число передать в виде объекта кому-нибудь. И все. Допустим число создано внутри метода. Оно хранится в стеке. Вызываем метод MyFunc(object o) или Console.Write(object o). Мы можем передать наше число, которое счас в стеке. Но компилятор упакует его в object - т.е. создаст в куче объект (с возможностями типа object), инициализирует его числом и передаст в метод. В стеке наше число останется. В куче новый объект появится. То же самое будет в случае, когда приводим число к объекту явно...
Закончили работу - стек с числом очистился, оникому уже не нужный объект в куче остался.
Лучше про боксинг пока не упоминать... Это НЕ ОТНОСИТСЯ к методам работы стека и кучи. Это работа компилятора для согласования типов данных.

Код пришли и мне, плиз.

ivashkanet дай плиз ссылку на место, где упоминается про "небольшиуе массивы хранятся в стеке  " просто я слышал, что создавать стековые массивы нужно специально. (тоже в той книжке. что упоминал, там, где указатели описываются) Может в 3.0 появилось?


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


Кодю потиху
****


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

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



Цитата(tol05 @  12.7.2007,  10:35 Найти цитируемый пост)
"небольшиуе массивы хранятся в стеке  "

Нет, про массивы я все же не видел. Только про List<T>. Но он же сделан на основе масссива...

Добавлено через 6 минут и 5 секунд
Цитата(tol05 @  12.7.2007,  10:35 Найти цитируемый пост)
просто я слышал, что создавать стековые массивы нужно специально

А я о таком даже не слышал. Можно мне ссылку
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 12.7.2007, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(tol05 @  12.7.2007,  10:35 Найти цитируемый пост)
Сами reference-типы еще остались в куче, до сборки мусора (все ячейки, содержащие реальные значения элементов массива arrInt).


Цитата(tol05 @  12.7.2007,  10:35 Найти цитируемый пост)
конечно они не в стеке. Они в куче,


Ага, наконец-то я услышал что хотел: элементы массива хранятся в куче!
Вот это и сбивает с толку. Как это value-type может в куче быть. Наверно, надо Рихтера всё-таки почитать smile 

З.Ы. Пример с пулом структур:

Предположим, есть у нас некая структура данных с размером этак 100..200 байт. Таких классов или структур (назовём её Particle, хотя название и назначение не суть важно), может понадобиться создавать много. Ну к примеру, иметь 10000 экземпляров одновременно. Варианты как делать это:

1. Объявить классом и создавать с пом. new по необходимости; хранить где угодно - в List<> например. Неэффективно ввиду GC, особенно если объекты хранятся долго и попадают в 1-е а то и 2-е поколение сборки мусора
2. Объявить структурой и также создавать с пом. new, хранить в массиве или List<> или др. типизированной коллекции. Этот вариант лучше чем №1 ввиду того что юзаем непрерывные массивы, состоящие из структур (List<> тоже массив юзает), никакого боксинга и никаких затрат на GC. Поясняю: массив структур во время сборки мусора рассматривается как 1 объект. Недостатки всё же есть: 
- если юзать массив, теряем возможность добавления/удаления элементов
- если юзать List или другую коллекцию, получаем затраты на удаление элемента - в List.RemoveAt весь хвост сдвигается вверх с пом. Array.Copy()
- в случае доступа по индексу List возвращает копию а не экземпляр структуры, о чём говорил ivashkanet; это лишние затраты которых желательно избегать в случае "толстых" структур (более 4 байт)
3. Наконец, вариант с пулом структур. Остановлюсь подробнее на этом.

Под простейшим пулом структур в моём понятии подразумевается коллекция, аналогичная List<>, позволяющая добавлять, удалять элементы и проходить по ним в цикле. Внутри себя это обычный массив структур, обёрнутый парой методов - Alloc, Remove(i) и выставляющий тот самый массив как public-поле. Вот примеры кода:

Код
using System;

class Pool<T> where T : struct
{
    public T[] Arr = new T[0];
    public int Count = 0;

    /// <summary>Выделяет элемент в пуле</summary>
    /// <returns>Индекс нового элемента</returns>
    public int Alloc()
    {
        return Alloc(1);
    }

    /// <summary>Выделяет заданное количество элементов в пуле</summary>
    public int Alloc(int amount)
    {
        Count += amount;
        if (Count > Arr.Length)
            Array.Resize(ref Arr, (Count * 4) / 3); // с запасом
        return Count - 1;
    }

    /// <summary>Освобождает элемент пула</summary>
    /// <param name="i">Индекс удаляемого элемента</param>
    public void RemoveAt(int i)
    {
        if (i < 0 || i >= Count) return;

        Count--;
        if (i != Count && Count > 0)
        {
            // если удаляем из середины, копируем элемент из хвоста в освободившуюся позицию
            Arr[i] = Arr[Count];
        }
    }
}

struct Particle
{
    public int A, B, C;
    public float D, E, F;
}

class Program
{
    // вымышленный метод "инициализирующий" элемент пула
    void InitParticle(ref Particle particle)
    {
        particle.A = particle.B = particle.C = 1;
        particle.D = 2; particle.E = 3; particle.F = 4;
    }

    // ещё один вымышленный метод, "обрабатывающий" элемент
    void ProcessParticle(ref Particle particle)
    {
        particle.A = particle.B * particle.C;
        particle.E = 1; particle.F += 10;
        particle.D += particle.E * particle.F;
    }

    void Test()
    {
        Pool<Particle> pool = new Pool<Particle>();
        pool.Alloc(1000);

        for (int i = 0; i < pool.Count; i++)
            InitParticle(ref pool.Arr[i]);

        pool.RemoveAt(100);

        for (int i = 0; i < pool.Count; i++)
            ProcessParticle(ref pool.Arr[i]);

    }


    static void Main()
    {
        new Program().Test();
    } 
}


З.Ы.Ы. за нарушение принципов ООП не ругать! Я о них знаю  smile. Есть такие случаи, где выгоднее нарушить инкапсуляцию, чем потерять в производительности.

Добавлено через 41 секунду
ivashkanet, 
Цитата(ivashkanet @  12.7.2007,  10:46 Найти цитируемый пост)
просто я слышал, что создавать стековые массивы нужно специально

А я о таком даже не слышал. Можно мне ссылку

См. оператор stackalloc, но он возвращает указатель а не массив, и требует unsafe.


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


Эксперт
***


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

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



может и офф-топик. но все же...
Цитата(mr.DUDA @  12.7.2007,  12:08 Найти цитируемый пост)
Вот это и сбивает с толку. Как это value-type может в куче быть.

А что тогда вообще в куче может быть, по-твоему?  smile 
Класс, у которого два поля и оба int. Он в куче. А его два поля где? тоже в куче. В куче выделено два блока памяти для хранения двух int
Так же и массив. int[10] - в куче выделен блок памяти для хранения десяти int

Спасибо за код. Я посмотрю, но комментировать не буду. Просто интересный вариант, со своим правом на существование ... smile


ivashkanet, ссылка - "С# 2005 для профессионалов", 
Цитата(tol05 @  12.7.2007,  10:35 Найти цитируемый пост)
там, где указатели описываются
  smile 



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


Бывалый
*


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

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



ок простой вопрос smile , до ужаса smile 
когда мы жмем три чудесные кнопочки и запускаем в Винде (да будет проклят Билл) в диспечере задач --> закладку Процессы
там есть колонки: Память и Вирувальная память

Вопрсы: Какая-то из них показывает размер Кучи или Стека или это что-то не то?????? smile 
 smile Какими средствами можна их посмотрть??? smile 
И ефективно ли запускать GC после нагруженых методов и функций??? smile 
--------------------
Иногда шаг вперед - это результат хорошего пинка под зад.
PM MAIL   Вверх
tol05
Дата 12.7.2007, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Данные для 32-битной Windows
размер стека:
  по умолчанию под стек каждого потока выделяется 1МБайт памяти. (это для "юзания" программой, не учитывает объемы системмных областей)
размер кучи:
  по умолчанию для каждого процесса выделяется 4Гбайт виртуальной памяти.
Цитата(Azzdorf @  12.7.2007,  17:33 Найти цитируемый пост)
Какими средствами можна их посмотрть

Профайлерами, если не ошибаюсь.

То, что ты видишь в диспечере задач - это используемый сейчас объем памяти

Цитата(Azzdorf @  12.7.2007,  17:33 Найти цитируемый пост)
ефективно ли запускать GC после нагруженых методов и функций??? 

Да, эффективно. Именно поэтому в public интерфейс и выведены члены класса GC, чтобы с ними работать smile



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


Бывалый
*


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

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



Цитата(tol05 @ 12.7.2007,  17:48)
То, что ты видишь в диспечере задач - это используемый сейчас объем памяти

физической или оперативной???

Добавлено через 2 минуты
если оперативной то тогда почему моя маленькая простая прога ест 48метров, когда тотже запищеный файл ворда - 10метров???
--------------------
Иногда шаг вперед - это результат хорошего пинка под зад.
PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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