Ru-MaNGOS

Вернуться   Ru-MaNGOS > Документация > Языки программирования

Важная информация

Языки программирования Изучаем С++, Sql, php, Lua, Python

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 03.08.2010, 04:10   #1
LLIbIcpEP
Новичок
 
Аватар для LLIbIcpEP
 
Регистрация: 08.03.2010
Сообщений: 20
Сказал(а) спасибо: 8
Поблагодарили 2 раз(а) в 1 сообщении
LLIbIcpEP На верном пути
По умолчанию Monodevelop on Debian + Singleton

Доброго времени суток. Вообщем ввиду появления немного свободного времени решил продолжить разработку WWLauncher, если кто помнит...
В серверной части используется паттерн одиночка. Все тесты проводил на сервере под дебианом, кодил я в винде, в монодевелоп 2.4. Через неделю после возобновления разработки перешел на дебиан и на десктопе, поставил там моно 2.6, монодевелоп 2.4 (из сорцов). Каково же было мое удивление, когда я стащил с репо сорцы серверной части и они отказались компилится (а день назад прекрасно компилились под виндой).
Юзал свой вариант класса-потомка для классов-синглтонов, после медитации попробовал использовать то, что сейчас на википедии.
Код:
public class Singleton<T> where T : class
{
  protected Singleton() { }
  private sealed class SingletonCreator<S> where S : class
  {
    private static readonly S instance = (S) typeof(S).GetConstructor(
                BindingFlags.Instance | BindingFlags.NonPublic,
                null,
                new Type[0],
                new ParameterModifier[0]).Invoke(null);
    public static S CreatorInstance
    {
      get { return instance; }
    }
  }
  public static T Instance
  {
    get { return SingletonCreator<T>.CreatorInstance; }
  }
}
Монодевелоп в обоих вариантах говорит:
Код:
Singleton.cs(38,38): Error CS0305: Using the generic type `Singleton<T>.SingletonCreator<S>' requires `2' type argument(s) (CS0305)
Эта строчка:
Код:
get { return SingletonCreator<T>.CreatorInstance; }
Я что-то не понял, в чем дело...
Всем заранее спасибо...

PS: Если кто то хочет изучать си шарп и присоединится к команде - милости прошу Проект исключительно для самообразования, ну и, скажем так, для внесения своей лепты в опенсорц-комьюнити мангоса/тринити (pet-project), упор на Mono (т.е. работа серверной части под Linux), поддержка configure && make в Linux, обратная совместимость с .NET 2.0. Большие планы на развитие, в частности на создание мощных инструментов для ГМов (ака квайс) но без доступа к серверу mysql/ssh. Куча фишек, которые в принципе не нужны, но просто интересно было их реализовывать (например модуль CompID). Особенно необходим человек, способный рисовать для клиентской части интерфейс (кнопочки и т.д.).
LLIbIcpEP вне форума   Ответить с цитированием
Старый 03.08.2010, 15:15   #2
randle
Гость
 
Сообщений: n/a
По умолчанию

Цитата:
Сообщение от LLIbIcpEP Посмотреть сообщение
Я что-то не понял, в чем дело...
Всем заранее спасибо...
Добрый день.
Не знаю, чего и как вы хотели от синглтона. Ваш код у меня в студии, кстати, без вопросов компилируется.

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

Код:
    public static class TSingleton<T> where T : class
    {
        private static Dictionary<Type, object> FInstances = new Dictionary<Type, object>();
        private static object Instantiate(Type AType)
        {
            ConstructorInfo locInfo =
                AType.GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic, null, Type.EmptyTypes, new ParameterModifier[0]);
            return locInfo.Invoke(null);
        }
        public static T Instance
        {
            get
            {
                if(!FInstances.ContainsKey(typeof(T)))
                    FInstances.Add(typeof(T), Instantiate(typeof(T)));
                return FInstances[typeof(T)] as T;
            }
        }
    }
Использование:
Код:
(TSingleton<string>.Instance).Split();
(TSingleton<Form>.Instance).Show();
по сути все то же самое, просто из объявления женерика выкинул второй тип и руками собрал словарь. Если этот вариант устроит, надо будет лишние N минут посидеть поглядеть на него на предмет ThreadSafety и возможно добавить пару lock-ов.

Вообще, в моем представлении синглтон - паттерн бесполезный и выглядит как:
Код:
    public sealed class TSingle
    {
        private static readonly TSingle FInstance = new TSingle();
        public static TSingle Instance { get { return FInstance; } }
    }
но я, наверное, отстал от жизни.

Цитата:
Сообщение от LLIbIcpEP Посмотреть сообщение
PS: Если кто то хочет изучать си шарп и присоединится к команде - милости прошу
...
Особенно необходим человек, способный рисовать для клиентской части интерфейс (кнопочки и т.д.).
C# я вроде худо-бедно знаю, но поучаствовал бы в чем-нибудь полезном. Правда, в разработке мангоса я человек новый и многое надо будет мне рассказывать. Но некоторый интерес и чуть-чуть времени есть. Опять-таки, сочиняю я не на моне и не на линуксе, а на винде и студии с фреймворком, но и это обсуждается. Если будет интерес - в личке раззнакомимся ближе.

Последний раз редактировалось randle; 03.08.2010 в 15:20.
  Ответить с цитированием
Пользователь сказал cпасибо:
LLIbIcpEP (03.08.2010)
Старый 03.08.2010, 15:57   #3
LLIbIcpEP
Новичок
 
Аватар для LLIbIcpEP
 
Регистрация: 08.03.2010
Сообщений: 20
Сказал(а) спасибо: 8
Поблагодарили 2 раз(а) в 1 сообщении
LLIbIcpEP На верном пути
По умолчанию

Цитата:
Сообщение от randle Посмотреть сообщение
Добрый день.
Не знаю, чего и как вы хотели от синглтона. Ваш код у меня в студии, кстати, без вопросов компилируется.

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

Код:
    public static class TSingleton<T> where T : class
    {
        private static Dictionary<Type, object> FInstances = new Dictionary<Type, object>();
        private static object Instantiate(Type AType)
        {
            ConstructorInfo locInfo =
                AType.GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic, null, Type.EmptyTypes, new ParameterModifier[0]);
            return locInfo.Invoke(null);
        }
        public static T Instance
        {
            get
            {
                if(!FInstances.ContainsKey(typeof(T)))
                    FInstances.Add(typeof(T), Instantiate(typeof(T)));
                return FInstances[typeof(T)] as T;
            }
        }
    }
Использование:
Код:
(TSingleton<string>.Instance).Split();
(TSingleton<Form>.Instance).Show();
по сути все то же самое, просто из объявления женерика выкинул второй тип и руками собрал словарь. Если этот вариант устроит, надо будет лишние N минут посидеть поглядеть на него на предмет ThreadSafety и возможно добавить пару lock-ов.

Вообще, в моем представлении синглтон - паттерн бесполезный и выглядит как:
Код:
    public sealed class TSingle
    {
        private static readonly TSingle FInstance = new TSingle();
        public static TSingle Instance { get { return FInstance; } }
    }
но я, наверное, отстал от жизни.



C# я вроде худо-бедно знаю, но поучаствовал бы в чем-нибудь полезном. Правда, в разработке мангоса я человек новый и многое надо будет мне рассказывать. Но некоторый интерес и чуть-чуть времени есть. Опять-таки, сочиняю я не на моне и не на линуксе, а на винде и студии с фреймворком, но и это обсуждается. Если будет интерес - в личке раззнакомимся ближе.
Так дело в том, что под виндой и в студии и в монодевелоп у меня это компилится. Вопрос в том, почему этот код отказывается компилится в дебиане, причем даже без использования монодевелоп, а голый моно-компилятор шарпа через configure && make. А ваш пример компилится, но в определении синглтона - это класс с закрытым конструктором, а тут получается статический класс... я шарп учил самоучкой, может чего не понимаю, но разве статический класс способен хранить данные в памяти?
А вообще, я использую синглтон для класса, хранящего в памяти конфиги, и класса-интерфейса к мускулу. Очень удобно инициализировать это все при старте сервера, а потом использовать повсеместно в коде без лишних объявлений, конструкторов и инициализаций...

PS: Моно это тот же .NET только под линукс. Просто все сервера в основном поднимаются под никсами, вот однажды я и озадачился вопросом, как заставить работать мой ввл-сервер там. Все оказалось довольно просто Разницы в синтаксисе никакой. А проблема, что возникла у меня - это я что то напортачил с версией или сборкой компилятора, но я пока не пойму где именно напортачил, потому и задаю вопросы... То, что вы кодите в винде и в студии ничего страшного - я сам так и кодил долгое время. Между моно и .NET нет различий, если не юзать всякие qt и так далее http://code.google.com/p/wwl3-server/ http://code.google.com/p/wwl3/ вот репо проектов, если интересно - пишите номер аськи в ЛС. Код кривоват, но все это писалось год назад, сейчас я уже поднабрался уму-разуму и потихоньку начал исправлять) Вот сейчас протокол делаю человеческий, вообщем doc/TODO там все есть...
LLIbIcpEP вне форума   Ответить с цитированием
Старый 03.08.2010, 16:16   #4
Konctantin
RuDB Dev
 
Аватар для Konctantin
 
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
Konctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всем
По умолчанию

Цитата:
А вообще, я использую синглтон для класса, хранящего в памяти конфиги, и класса-интерфейса к мускулу.
Используйте static class и static методы и не мучайтесь.

ЗЫ. и не понимаю, зачем изобретать велосипед, если есть готовый класс Settings, никаких хлопот не будет с настройками и их хранением...

загрузка данных
Код:
            _tbHost.Text = Settings.Default.Host;
            _tbPort.Text = Settings.Default.Port;
            _tbUser.Text = Settings.Default.User;
            _tbPass.Text = Settings.Default.Pass;
сохранение данных:
Код:
            Settings.Default.Host = _tbHost.Text;
            Settings.Default.Port = _tbPort.Text;
            Settings.Default.User = _tbUser.Text;
            Settings.Default.Pass = _tbPass.Text;
            Settings.Default.Save();
__________________

Последний раз редактировалось Konctantin; 03.08.2010 в 16:22.
Konctantin вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
LLIbIcpEP (03.08.2010)
Старый 03.08.2010, 16:19   #5
LLIbIcpEP
Новичок
 
Аватар для LLIbIcpEP
 
Регистрация: 08.03.2010
Сообщений: 20
Сказал(а) спасибо: 8
Поблагодарили 2 раз(а) в 1 сообщении
LLIbIcpEP На верном пути
По умолчанию

Цитата:
Сообщение от Konctantin Посмотреть сообщение
Используйте static class и static методы и не мучайтесь.

ЗЫ. и не понимаю, зачем изобретать велосипед, если есть готовый класс Settings, никаких хлопот не будет с настройками и их хранением...
На счет интерфейса к мускулу, если использовать статик класс то каждый раз придется устанавливать соединение. На практике убедился, как хреново работает встроенный в mysql-connector пул соединений, и как долго это соединение устанавливается, поэтому реализовываю свой пул с помощью синглтона, который будет держать минимум одно активное соединение все время работы.
PS: А в каком формате храняться конфиг-файлы класса Settings?

Последний раз редактировалось LLIbIcpEP; 03.08.2010 в 16:26.
LLIbIcpEP вне форума   Ответить с цитированием
Старый 03.08.2010, 16:25   #6
Konctantin
RuDB Dev
 
Аватар для Konctantin
 
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
Konctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всем
По умолчанию

Цитата:
На счет интерфейса к мускулу, если использовать статик класс то каждый раз придется устанавливать соединение.
это как? вы что то не так поняли:
http://github.com/LordJZ/spellwork_c...ySQLConnect.cs

вот посмотрите, один раз идет подключение, а потом делайте что хотите, пока не закроете соединение...


ЗЫ... сори, не тут, тут идет закрытие, но все зависит от вас, как сделаете, так и будет... просто после команды не закрываайте соединение...
__________________

Последний раз редактировалось Konctantin; 03.08.2010 в 16:28.
Konctantin вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
LLIbIcpEP (03.08.2010)
Старый 03.08.2010, 16:34   #7
LLIbIcpEP
Новичок
 
Аватар для LLIbIcpEP
 
Регистрация: 08.03.2010
Сообщений: 20
Сказал(а) спасибо: 8
Поблагодарили 2 раз(а) в 1 сообщении
LLIbIcpEP На верном пути
По умолчанию

Цитата:
Сообщение от Konctantin Посмотреть сообщение
это как? вы что то не так поняли:
http://github.com/LordJZ/spellwork_c...ySQLConnect.cs

вот посмотрите, один раз идет подключение, а потом делайте что хотите, пока не закроете соединение...


ЗЫ... сори, не тут, тут идет закрытие, но все зависит от вас, как сделаете, так и будет... просто после команды не закрываайте соединение...
Я так и делал раньше. Просто мой класс DBLayer более абстрактный. Раньше было так - создавался во время запуска его экземпляр как синглтон, потом через него все действия с мускулом происходили. Почему именно синглтон - потому что сервер многопоточный, как же из разных потоков к одному экземпляру, как не через синглтон... Так вот, было так: в строке соединения был включен пулинг, при каждом запросе открытие-запрос-закрытие соединения. Согласно документации должен юзаться пул соединений, т.е. при _conn.Close() соединение физически не закрывается, а отправляется в пулл.
Но потом делал анализатор гм-логов, и увидел как все это криво работает. В строке отключил пулинг, и перестал закрывать соединение - все заработало намного быстрее.
Вот как у меня: http://code.google.com/p/wwl3-server.../DB/DBLayer.cs
PS: А используется это все примерно так: http://code.google.com/p/wwl3-server.../DB/DBWorld.cs http://code.google.com/p/wwl3-server.../DBProvider.cs

Последний раз редактировалось LLIbIcpEP; 03.08.2010 в 16:41.
LLIbIcpEP вне форума   Ответить с цитированием
Старый 03.08.2010, 16:58   #8
Konctantin
RuDB Dev
 
Аватар для Konctantin
 
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
Konctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всем
По умолчанию

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

ЗЫ. получится то же самое... ИМХО.
__________________
Konctantin вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
LLIbIcpEP (03.08.2010)
Старый 03.08.2010, 20:39   #9
LLIbIcpEP
Новичок
 
Аватар для LLIbIcpEP
 
Регистрация: 08.03.2010
Сообщений: 20
Сказал(а) спасибо: 8
Поблагодарили 2 раз(а) в 1 сообщении
LLIbIcpEP На верном пути
По умолчанию

Цитата:
Сообщение от Konctantin Посмотреть сообщение
я не уверен в том, что Singleton оправдает ваши надежды, да, он создаст единый экземпляр, и вы будуте работать с этим экземпляром, но на сколько я знаю сам Singleton, при использовании его в мульти-поточной среде, в самом этом класе юзается lock, так что проще всего раз сделать подключение, и потом вызывать статик метод, с действием, предварительно сделав lock.

ЗЫ. получится то же самое... ИМХО.
Спасибо за совет. Я вовсе не от хорошей жизни выбрал самый сложный путь, я обдумывал и такой вариант, когда только проектировал приложение, но мне показалось что в таком случае статик-члены класса будут обращаться к несуществующим данным. Другими словами, если создать экземпляр класса, который хранит в себе переменные MySqlConnection, в одном потоке, а потом в других потоках использовать статик-методы этого класса, разве эти методы будут использовать именно те переменные, созданные в первом потоке?
PS: Я говорю вовсе не о потоках подключаемых клиентов (они у мена асинхронно обрабатываются), просто есть поток, обрабатывающий очередь электронной почты, есть поток генерирующий различную статистику, и еще поток, в котором работает асинхронный сервер. Т.е. потоки использующие DBLayer вовсе не связаны наследственными связями.

PPS: Или вы имеете ввиду каждый раз инициализировать новое соединение и подключаться? Но это вообще накладно по ресурсам...

Последний раз редактировалось LLIbIcpEP; 03.08.2010 в 21:00.
LLIbIcpEP вне форума   Ответить с цитированием
Старый 03.08.2010, 22:23   #10
Konctantin
RuDB Dev
 
Аватар для Konctantin
 
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
Konctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всем
По умолчанию

Нет, ну почему же, на стадии включения сервера, вы осуществляете подключение к БД., в статик классе оно так и остается открытым. Далее, используя lock вы просто выполняете команды (чтение запись) при этом не закрывая соединение, его можно будет закрыть, когда вы завершите работу с программой.

Вот пример программы, которая выполняет запросы из разных потоков:
PHP код:
using System;
using System.Threading;
using MySql.Data.MySqlClient;

namespace 
db_test
{
    class 
Program
    
{
        static 
void Main(string***91;***93; args)
        {
            
Console.Write("Opening connections... ");

            if (
MySQLConn.Connect())
                
Console.WriteLine("OK");
            else
                
Console.WriteLine("Fieled");

            if (!
MySQLConn.Connected)
                return;

            for (
int i 0100; ++i)
            {
                new 
Thread(() => 
                {
                    if (
MySQLConn.Execute(string.Format("INSERT INTO `test` VALUES ({0}, 'test_text_{0}')"i)))
                        
Console.WriteLine("Execute in Thread # {0}... OK"i);
                    else
                        
Console.WriteLine("Execute in Thread # {0}... Fieled"i); 
                    
Thread.Sleep(10);
                }).
Start();
            }
            
Console.ReadLine();
        }
    }

    public static class 
MySQLConn
    
{
        private static 
MySqlConnection _conn;
        public static 
bool Connected get; private set; }

        private static 
String ConnectionString
        
{
            
get { return "Server=localhost;Port=3306;Uid=root;Pwd=mangos;Database=test;character set=utf8;Connection Timeout=10"; }
        }
    
        public static 
bool Connect()
        {
            try
            {
                
_conn = new MySqlConnection(ConnectionString);
                
_conn.Open();
                
Connected true;
                return 
true;
            }
            catch { return 
false; }
        }
    
        public static 
bool Execute(string query)
        {
            
lock (_conn)
            {
                try
                {
                    
using (MySqlCommand _command = new MySqlCommand(query_conn))
                    {
                        
_command.ExecuteNonQuery();
                        return 
true;
                    }
                }
                catch { return 
false; }
            }
        }

        public static 
void Close()
        {
            if (
_conn != null)
                
_conn.Close();
            
Connected false;
        }
    }

__________________

Последний раз редактировалось Konctantin; 03.08.2010 в 22:39.
Konctantin вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
LLIbIcpEP (03.08.2010)
Старый 03.08.2010, 22:44   #11
LLIbIcpEP
Новичок
 
Аватар для LLIbIcpEP
 
Регистрация: 08.03.2010
Сообщений: 20
Сказал(а) спасибо: 8
Поблагодарили 2 раз(а) в 1 сообщении
LLIbIcpEP На верном пути
По умолчанию

Классно, спасибо, это все упрощает. Хотя не обьясняет, почему не компилилось... наверное умный дебиан хотел мне показать, какой бред я накодил
А еще вопрос, про mysql-connector .NET. Кто знает, как там правильно реализовать пулл соединений его родными средствами? То, как пишется в мануале на сайте мускула - работает гораздо медленнее, чем если не использовать пулл вовсе и держать соединение открытым. Но если мне нужно несколько одновременных соединений... я в принципе уже свыкся с мыслью, что мне придется собственный пулл организовывать, но может кто знает решение получше?
LLIbIcpEP вне форума   Ответить с цитированием
Старый 03.08.2010, 22:50   #12
Konctantin
RuDB Dev
 
Аватар для Konctantin
 
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
Konctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всем
По умолчанию

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

ЗЫ. Как показывает практика, к примеру офис с 20 клиентами, частота возникновения параллельных операций крайне мала (или же это доказывает, что никто нифига не делает)
__________________
Konctantin вне форума   Ответить с цитированием
Старый 03.08.2010, 22:54   #13
LLIbIcpEP
Новичок
 
Аватар для LLIbIcpEP
 
Регистрация: 08.03.2010
Сообщений: 20
Сказал(а) спасибо: 8
Поблагодарили 2 раз(а) в 1 сообщении
LLIbIcpEP На верном пути
По умолчанию

И тем не менее, проект образовательный, интересно же...
LLIbIcpEP вне форума   Ответить с цитированием
Старый 03.08.2010, 22:55   #14
Konctantin
RuDB Dev
 
Аватар для Konctantin
 
Регистрация: 01.02.2010
Адрес: localhost
Сообщений: 592
Сказал(а) спасибо: 323
Поблагодарили 283 раз(а) в 122 сообщениях
Записей в дневнике: 2
Konctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всемKonctantin Это имя известно всем
По умолчанию

ну тогда надо погуглить, черт интересно ведь стало, никогда с таким не работал...
__________________
Konctantin вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
LLIbIcpEP (03.08.2010)
Старый 03.08.2010, 23:00   #15
LLIbIcpEP
Новичок
 
Аватар для LLIbIcpEP
 
Регистрация: 08.03.2010
Сообщений: 20
Сказал(а) спасибо: 8
Поблагодарили 2 раз(а) в 1 сообщении
LLIbIcpEP На верном пути
По умолчанию

Из того, что я нагуглил: встроенный пулинг в коннектор активируется опцией Pooling=true, тогда при использовании Close() физически соединение не закрывается а идет в пулл. Время жизни соединения в пуле, и максимальное-минимальное количество соединений указываются отдельными опциями. Эту технологию я и использовал, пока не довелось написать небольшую тулзу с использованием моего DBLayer, которая парсит ГМ-лог (достаточно большой) на предмет .learn и выводит инфу о гме, таргете гма и так далее в датагрид. Вообщем все это происходило невообразимо долго... пока я не убрал пулинг к чертям и не оставил соединение открытым на все время работы программы. Вот и решил, что придется реализовывать пулинг самому. Но может в встроенном пулинге есть какой секрет...
LLIbIcpEP вне форума   Ответить с цитированием
Старый 15.08.2010, 16:41   #16
ispanec
Новичок
 
Регистрация: 08.03.2010
Сообщений: 26
Сказал(а) спасибо: 1
Поблагодарили 4 раз(а) в 4 сообщениях
ispanec На верном пути
По умолчанию

LLIbIcpEP, хорошая большая статья по потокам, а так же как сделать пул потоков... и вообще много полезного
Работа с потоками в C# ч1
Работа с потоками в C# ч2
ispanec вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
LLIbIcpEP (15.08.2010)
Старый 15.08.2010, 17:16   #17
LLIbIcpEP
Новичок
 
Аватар для LLIbIcpEP
 
Регистрация: 08.03.2010
Сообщений: 20
Сказал(а) спасибо: 8
Поблагодарили 2 раз(а) в 1 сообщении
LLIbIcpEP На верном пути
По умолчанию

Спасибо, это я читал года два назад
Только в теме речь идет не о самописном пуле потоков, и вообще не о пуле потоков, а о пуле соединений, реализованном в mysql-connector. Если я не пойму, как его юзать правильно, со временем придется самому реализовывать этот пул соединений, с блекджеком и шл*хами
PS: Кстати серверная часть лаучнера уже близка к релизу, сейчас шлифую код... На днях возьмусь перепиливать клиента.
LLIbIcpEP вне форума   Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[10952] Don't use singleton to access static functions. newsbot CMaNGOS Commits 0 03.01.2011 14:00
[10273] Avoid some redundent and recursive calls to SpellMgr singleton. newsbot CMaNGOS Commits 0 26.07.2010 16:00


Текущее время: 09:00. Часовой пояс GMT +3.


ru-mangos.ru - Русское сообщество MaNGOS
Главная цель проекта MaNGOS - обучающая, поэтому разрешается использовать исходный код и собранную программу только для образовательных целей.
Вы не можете использовать MaNGOS в коммерческих целях, а также не разрешается устанавливать публичные серверы на базе MaNGOS.
Любое копирование материалов, информации в любом виде без указания источника - форума Ru-MaNGOS будет считаться нарушением авторских прав и нарушением Уголовного Кодекса РФ, ст. 146 ст. 147.
Перевод vBulletin: zCarot