Телескопы покупают здесь


A A A A Автор Тема: Вопросы по астропрограммированию  (Прочитано 1053 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Василий ВершининАвтор темы

  • *****
  • Сообщений: 3 714
  • Благодарностей: 122
  • Per anus ad astra
    • Skype - vasiliy_vershinin
    • Сообщения от Василий Вершинин
Думаю, неплохо было бы создать здесь тему, в которой бы начинающие астропрограммеры вроде меня могли бы получить ответ на некоторые вопросы ;D

Собственно первый вопрос: пишу программу на C#  и столкнулся с проблемой использования многопоточности. По нажатию кнопки из файла считываются координаты, которые передаются в аском драйвер телескопа. Во время наведения окно программы заблокировано по понятным причинам. Запихнул все в отдельный поток - получил ругань на тему использования объектов не созданных этим потоком. Проблема ругани вроде решилась с помощью делегатов но тем не менее основное окно программы остается заблокированным во время выполения функции реализующей наведение.

фрагмент кода



delegate void ReadPlanDelegate();

        void ReadPlanThreadStart()
            {
                ReadPlanDelegate rdplndel = new ReadPlanDelegate(ReadPlan);
                Invoke(rdplndel, new object[] {});
                
        }
        
        private void button4_Click(object sender, EventArgs e)
        {

            Thread t = new Thread(ReadPlanThreadStart);
            t.Start();
                                  
        }

где ReadPlan() - функция отвечающая за чтение файла и наведение
« Последнее редактирование: 24 Июл 2009 [18:28:30] от Василий Вершинин »

Оффлайн Bikanio

  • Новичок
  • *
  • Сообщений: 49
  • Благодарностей: 0
    • Сообщения от Bikanio
Re: Вопросы по астропрограммированию
« Ответ #1 : 25 Июл 2009 [13:15:38] »
Мне кажется лучше всего задавать такие вопросы на тематических форума типа programmersforum.ru ;)

Оффлайн Ivan Mhitarov

  • Модератор
  • *****
  • Сообщений: 6 270
  • Благодарностей: 108
  • Награды Неоднократный победитель конкурса астрофото
    • Сообщения от Ivan Mhitarov
Re: Вопросы по астропрограммированию
« Ответ #2 : 25 Июл 2009 [15:13:53] »
Вася, посмотри на параметры вызова CoInitialize()
Иван Мхитаров
Кубанский Астрономический Клуб "45".

Оффлайн xd

  • *****
  • Сообщений: 17 973
  • Благодарностей: 378
    • Skype - deimos.belastro.net
  • Награды Открытие комет, астероидов, сверхновых звезд, научно значимые исследования.
    • Сообщения от xd
    • Белорусская любительская астрономическая сеть
Re: Вопросы по астропрограммированию
« Ответ #3 : 25 Июл 2009 [15:48:35] »
Хм.. Окно блокироваться не должно, но может просто не реагировать на внешние раздражители, если прилаге не хватает времени на обработку действий пользователя, когда активен поток наведения.
Если это так, то можно снизить приоритет вспомогательного потока до Idle.

Кстати, код можно написать гораздо компактней:
        delegate void ReadPlanDelegate();
        
        private void button4_Click(object sender, EventArgs e)
        {
            new Thread(delegate()
            {
                    Thread.CurrentThread.IsBackground = true;
                    Invoke(new ReadPlanDelegate(ReadPlan), new object[0]);
            }).Start();
                                  
        }
Кстати, потоки неплохо бы делать фоновыми. Но это отдельная история.
У природы нет плохой погоды, у неё просто на нас аллергия.

Учение без размышления бесполезно, но и размышление без учения опасно /Конфуций/
Слово есть поступок. /Л. Толстой/

Оффлайн GTA

  • *****
  • Сообщений: 1 619
  • Благодарностей: 38
  • ye be warned
    • Сообщения от GTA
Re: Вопросы по астропрограммированию
« Ответ #4 : 26 Июл 2009 [20:17:18] »
Проблема ругани вроде решилась с помощью делегатов но тем не менее основное окно программы остается заблокированным

ну правильно - ты же Invoke'ом засунул весь код из отдельной thread в основную (STA), т.е. по сути получил первоначальный вариант, оттого и блокируется все, что ничего не поменялось.
thread нужно запускать обычным start, а вот тчобы не было этого:
Цитата
Запихнул все в отдельный поток - получил ругань на тему использования объектов не созданных этим потоком.
нужно все вызовы на такие объкты (UI controls например) делать через делегаты и соответвующими invoke'ами.
т.е. invoke использовать только на объекты из других thread, а не на весь код целиком.

SkyWatcher reflector 150/750 EQ3-2 + SW refractor 80/400 EQ1tabletop

Оффлайн xd

  • *****
  • Сообщений: 17 973
  • Благодарностей: 378
    • Skype - deimos.belastro.net
  • Награды Открытие комет, астероидов, сверхновых звезд, научно значимые исследования.
    • Сообщения от xd
    • Белорусская любительская астрономическая сеть
Re: Вопросы по астропрограммированию
« Ответ #5 : 26 Июл 2009 [20:19:25] »
Ну да... Длительная операция отрабатывала в контексте основного потока... Вот и результат...
У природы нет плохой погоды, у неё просто на нас аллергия.

Учение без размышления бесполезно, но и размышление без учения опасно /Конфуций/
Слово есть поступок. /Л. Толстой/

Оффлайн Василий ВершининАвтор темы

  • *****
  • Сообщений: 3 714
  • Благодарностей: 122
  • Per anus ad astra
    • Skype - vasiliy_vershinin
    • Сообщения от Василий Вершинин
Re: Вопросы по астропрограммированию
« Ответ #6 : 26 Июл 2009 [23:11:55] »
то есть чтобы все было ок нужно прописать отдельную функцию допустим для заполнения текстбокса, и ее вызывать инвоком в функции, которая будет запускаться в отдельном потоке?

Оффлайн xd

  • *****
  • Сообщений: 17 973
  • Благодарностей: 378
    • Skype - deimos.belastro.net
  • Награды Открытие комет, астероидов, сверхновых звезд, научно значимые исследования.
    • Сообщения от xd
    • Белорусская любительская астрономическая сеть
Re: Вопросы по астропрограммированию
« Ответ #7 : 26 Июл 2009 [23:18:33] »
Типа того. Кстати, надо бы посмотреть, какие стандартные обобщённые делагаты есть в природе. Полезным может оказаться Action<T>:

void SetTextboxValue(String value)
{
  if (this.someTextBox.InvokeRequired)
  {
    this.someTextBox.Invoke(new Action(SetTextboxValue), new object[]{value});
  }
  else
  {
    this.someTextBox.Text = value;
  }
}

// ...

new Thread(delegate()
{
  // do something
  SetTextboxValue("some value");
  // do something else
}

У природы нет плохой погоды, у неё просто на нас аллергия.

Учение без размышления бесполезно, но и размышление без учения опасно /Конфуций/
Слово есть поступок. /Л. Толстой/

Оффлайн GTA

  • *****
  • Сообщений: 1 619
  • Благодарностей: 38
  • ye be warned
    • Сообщения от GTA
Re: Вопросы по астропрограммированию
« Ответ #8 : 30 Июл 2009 [03:57:17] »
то есть чтобы все было ок нужно прописать отдельную функцию допустим для заполнения текстбокса, и ее вызывать инвоком в функции, которая будет запускаться в отдельном потоке?

совершенно верно - должен быть не один Invoke на всю байду, а несколько Invoke-ов внутри функции ReadPlan() на общение с UI
SkyWatcher reflector 150/750 EQ3-2 + SW refractor 80/400 EQ1tabletop