Еще 1 вопрос по Threadind

Программирование на Юнити.

Еще 1 вопрос по Threadind

Сообщение foonk 04 мар 2011, 16:00

Доброго дня!
Ситуация следующая. Запускаю поток, в котором обращаюсь к БД, но поток с 1 раза не успевает получить информацию из БД (полная Ж) . При повторных запусках потока информация приходит. Причем происходит такое только при общении к большим таблицам (1050 строк, 21 столбец). При обращении к маленькой таблице таких проблем не возникает.
Вопрос, как продлить время действия потока, если можно так выразиться?
Вероятнее всего я неправильно обращаюсь с потоками. Вот кусочек кода:
Синтаксис:
Используется csharp
public void GetMitishiLine1BusyThread(){
        ThreadStart threadDelegate = new ThreadStart(GetMitishiLine1Busy);
        Thread newThread = new Thread(threadDelegate);
        newThread.Start();
        }
        //МЫТИЩИ ЛИНИЯ 1
        public void GetMitishiLine1Busy() {
                dbConnection = new MySqlConnection(connectionString);
                dbConnection.Open();
                IDbCommand dbCommand = dbConnection.CreateCommand();
                string getMitishiL1 ="SELECT COUNT(*) FROM mitishi WHERE busy=1 AND line=1";           
                Debug.Log("SQL: " + getMitishiL1);
                dbCommand.CommandText = getMitishiL1;
                IDataReader reader = dbCommand.ExecuteReader();
                        while(reader.Read()) {
                        busyMitishiL1 = reader.GetInt32(0);
                        }
                reader.Close();
                reader = null;
                dbCommand.Dispose();
                dbCommand = null;
                dbConnection.Close();
        }
— 2010-й год. В Ладу Калину поставили первый Глонасс-приемник размером с утюг. В то же время Эппл выпускает плеер размером меньше спичечного коробка с цветным дисплеем и тачскрином.
Добавить foonk09 в Skype
Аватара пользователя
foonk
UNITрон
 
Сообщения: 302
Зарегистрирован: 16 май 2009, 20:25
Откуда: Москва
  • ICQ

Re: Еще 1 вопрос по Threadind

Сообщение alexz 04 мар 2011, 23:47

Попробуй убрать вызов Debug.Log из кода потока. API Unity не потокобезопасно, его функции можно вызывать только из главного потока. Даже если бы всё изначально работало, то рано или поздно поток бы упал.

--
Нет смысла создавать и инициализировать делегат, только для того чтобы передать его в конструктор потока:
Thread newThread = new Thread(GetMitishiLine1Busy);
alexz
UNITрон
 
Сообщения: 270
Зарегистрирован: 16 ноя 2010, 23:37

Re: Еще 1 вопрос по Threadind

Сообщение gnoblin 05 мар 2011, 02:13

но дебаг выводить можно и потокобезопасно, к слову...
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Еще 1 вопрос по Threadind

Сообщение alexz 05 мар 2011, 02:36

Хрен знает. Везде пишут, что Debug нельзя в том числе. Где-то попадалось что-то про потокобезопасный дебаг, но не помню, писали про стандартное API или сторонний класс. Давно ищу, не могу найти, где я это читал.
alexz
UNITрон
 
Сообщения: 270
Зарегистрирован: 16 ноя 2010, 23:37

Re: Еще 1 вопрос по Threadind

Сообщение Neodrop 05 мар 2011, 03:32

НА заборе тоже пишут слово хм.. Бык. Но корову к нему водить без толку.
Ещё с 3.0 Debug стал потокобезопасным. (если не ошибся версией [unity 3D] ). Читаем описания релизов.
Правда, тем не менее, работать с объектами Unity из потоков - это искать на (полная Ж) приключений. Считать там математику или держать сеть - запросто. Остальное не рекомендуется без глубоких знаний матчасти.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Еще 1 вопрос по Threadind

Сообщение zoon 05 мар 2011, 04:11

Neodrop писал(а):Правда, тем не менее, работать с объектами Unity из потоков - это искать на (полная Ж) приключений. Считать там математику или держать сеть - запросто. Остальное не рекомендуется без глубоких знаний матчасти.


Я бы ничего там без синхронизации не делал. Reactive Rx, кстати для этого и предназначен - сделать асинхронное прграммирование простым и понятным:
Синтаксис:
Используется csharp
private void Start()
{

    Func<int, int> donothing = timeout =>
        {
            Thread.Sleep(timeout);
            return timeout;
        };


    // Превращаем нашу функцию в асинхронный IObservable
    var observableTask = donothing.ToAsync();


    // Запускаем по очереди 3 разных задачи в ThreadPool,
    // синхронизируем результат с главным потоком Unity
    var subscribe = observableTask(4000)                      // первая
        .Concat(Observable.Defer(() => observableTask(4000))) // вторая
        .Concat(Observable.Defer(() => observableTask(4000))) // третья
        .UnityTimestamp()
        .ObserveOnUnity() // <- синхронизируемся с Unity
        .Subscribe(
            timestamp =>
            // Debug.Log вызывается в главном потоке!
            Debug.Log(String.Format(">>> {0}", timestamp.Pretty())));
   
    // Запоминаем subscribe на случай если об'ект будет разрушен раньше, чем
    // задачи закончатся
    _subscribes.Add(subscribe);

}

void OnDisable()
{
    // Если об'ект разрушается - уничножаем подписки
    _subscribes.Dispose();
}
 
Джаггер
Evo
Аватара пользователя
zoon
UNIт
 
Сообщения: 58
Зарегистрирован: 24 май 2010, 08:27

Re: Еще 1 вопрос по Threadind

Сообщение Neodrop 05 мар 2011, 04:25

Я бы рекомендовал открыть отдельную тему по RX
Вы бы, вероятно, оказали многим услугу, немного подсветив им путь. :ymdaydream:
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Еще 1 вопрос по Threadind

Сообщение foonk 05 мар 2011, 07:19

Спасибо, обязательно сегодня попробую!
— 2010-й год. В Ладу Калину поставили первый Глонасс-приемник размером с утюг. В то же время Эппл выпускает плеер размером меньше спичечного коробка с цветным дисплеем и тачскрином.
Добавить foonk09 в Skype
Аватара пользователя
foonk
UNITрон
 
Сообщения: 302
Зарегистрирован: 16 май 2009, 20:25
Откуда: Москва
  • ICQ

Re: Еще 1 вопрос по Threadind

Сообщение foonk 05 мар 2011, 11:54

Убрал Debug.Log, не помогло ((
Thread newThread = new Thread(GetMitishiLine1Busy); Такая конструкция не запускает поток. Точнее, может и запускает, но ничего не происходит.
@zoon
А можно примерчик с моим случаем? А то я пока не разобрался с RX. Думаю дальше я бы разобрался.
— 2010-й год. В Ладу Калину поставили первый Глонасс-приемник размером с утюг. В то же время Эппл выпускает плеер размером меньше спичечного коробка с цветным дисплеем и тачскрином.
Добавить foonk09 в Skype
Аватара пользователя
foonk
UNITрон
 
Сообщения: 302
Зарегистрирован: 16 май 2009, 20:25
Откуда: Москва
  • ICQ

Re: Еще 1 вопрос по Threadind

Сообщение alexz 05 мар 2011, 15:07

Нашёл: «Debug.Log is now thread safe.»

Хоть в чём-то теперь есть уверенность.
alexz
UNITрон
 
Сообщения: 270
Зарегистрирован: 16 ноя 2010, 23:37

Re: Еще 1 вопрос по Threadind

Сообщение zoon 05 мар 2011, 16:19

foonk писал(а):Убрал Debug.Log, не помогло ((
@zoon
А можно примерчик с моим случаем? А то я пока не разобрался с RX. Думаю дальше я бы разобрался.

Я думаю в вашем случае потоки не причем т.к. ExecuteReader синхронная операция. Проблема у вас в чем-то другом. Попробуйте засунуть все внутри делегата в try-catch , добавьте отладочной печати на разных стадиях коннекта к db.
Джаггер
Evo
Аватара пользователя
zoon
UNIт
 
Сообщения: 58
Зарегистрирован: 24 май 2010, 08:27


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3