Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.08.2013, 23:09   #1
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию Вывод информации о процессе

Здравствуйте, у меня такая проблема.
Есть основное приложение которое запускает поток с достаточно тяжелой функцией расчетов.

Главное приложение является MDI контейнером.
Так вот задача выводить информацию о работе потока в определенные окна которые являются дочерними в данном контейнере.

Сделал функцию Update которая через Invoke вызывала функцию обновления в дочернем окне. Точнее там в TreeView обновлял нужную ветку дерева.
Вот код:
Код:
private void UpdateStrategiesForm()
        {
            if (StrategyForm != null)
            {
                if (StrategyForm.InvokeRequired) StrategyForm.Invoke(new MethodInvoker(() => StrategyForm.UpdateView(_strategies)));
                else StrategyForm.Invoke(new MethodInvoker(() => StrategyForm.UpdateView(_strategies)));
            }
        }
Запустил профилировщик и ужаснулся ... Функция UpdateStrategiesForm занимает 21% времени ...
Да и метод внутри
Код:
StrategiesTree.Nodes[0].Nodes[list[i].Index.ToString()].Text = list[i].Name + "; Выполнение: "+max.ToString();
Тоже времени занимает кучу.


Подскажите пожалуйста как правильно организовать вывод информации из потока?? Как это делают в серьезных программах что у них ничего не тормозит.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 28.08.2013, 23:16   #2
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Навскидку:
а) Обновлять информацию о потоке пореже. Не на каждой же итерации это делать
б) Вынести обновление информации в отдельный поток с низким приоритетом, который периодически будет опрашивать "тяжелый" поток на предмет "информации", и после выводить её на нужные формы
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 28.08.2013, 23:23   #3
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Цитата:
Сообщение от Luuzuk Посмотреть сообщение
Навскидку:
а) Обновлять информацию о потоке пореже. Не на каждой же итерации это делать
б) Вынести обновление информации в отдельный поток с низким приоритетом, который периодически будет опрашивать "тяжелый" поток на предмет "информации", и после выводить её на нужные формы
Хорошо ... Поток это хорошо, но вот одно но... Хотелось бы сделать так чтобы у обоих потоков был указатель на объект расчетов.
Вот как сделать чтобы передать указатель в поток, который бы наблюдал за изменениями объекта??
Передавал ref Strategy, но почему то изменения не отслеживаются ... такое ощущение что на каком то этапе создается клон объекта.

Можете как то прокомментировать такое поведение?
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 28.08.2013, 23:55   #4
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Строго говоря, передать нужно ссылку на объект, а не указатель, C# все-таки
Если Strategy - значимый тип (структура), то передастся действительно его копия. Если же Strategy - класс, то все зависит от конкретной реализации.
Потоки как создаете?
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 29.08.2013, 08:17   #5
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Цитата:
Сообщение от Luuzuk Посмотреть сообщение
Строго говоря, передать нужно ссылку на объект, а не указатель, C# все-таки
По поводу ссылок. На сколько я могу судить "Ссылка = указатель" Сказывается параллельная работа на С++ ...

Цитата:
Сообщение от Luuzuk Посмотреть сообщение
Если Strategy - значимый тип (структура), то передастся действительно его копия. Если же Strategy - класс, то все зависит от конкретной реализации.
Потоки как создаете?
Strategy - это класс, причем в основной форме у меня целый список этих классов. StrategyCollection - класс контейнер.

В главной форме есть метод DoProcess() в обязанности которого входит расчет каждой стратегии. Этот метод я и запускаю в потоке.
Код:
Thread execthr = new Thread(DoProcess);
execthr.Start();
Главное чтобы суть была ясна. Так вот. Придумал сделать так...

Код:
Form2 ViewerForm = new Form2(ref StrategyCollection s_list);
В конструкторе второй форму я сохраняю s_list во внутреннюю переменную.
Также во второй форме создаю таймер (либо поток низкоприор.) который наблюдает за этим списком.
Но вот почему то когда в исходный объект списка вносятся изменения то во второй форме их не видно.. Почему? Вроде передал ссылку ref
Поправьте пожалуйста если что-то не правильно.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 29.08.2013, 09:16   #6
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

ref используется немного для других случаев, StrategyCollection в любом случае по ссылке передастся

Каким образом DoProcess() получает доступ к набору стратегий? Изменяет ли он их? Один о тот же объект передается в форм2 и поток вычисления? Эти и еще 100500 вопросов остаются открытыми, т.к. зависят от конкретной реализации, которую вы здесь не привели
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 29.08.2013, 11:14   #7
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Цитата:
Сообщение от Luuzuk Посмотреть сообщение
ref используется немного для других случаев, StrategyCollection в любом случае по ссылке передастся

Каким образом DoProcess() получает доступ к набору стратегий? Изменяет ли он их? Один о тот же объект передается в форм2 и поток вычисления? Эти и еще 100500 вопросов остаются открытыми, т.к. зависят от конкретной реализации, которую вы здесь не привели
Код:
public partial class MainForm : Form
    {
// это единственный объект состояние которого надо отслеживать
StrategyCollection _strategies = null;

private void Process(object state)
        {
// тут обработка объекта _strategies.
//данные внутри могут изменятся.
}

// запускаем поток
private void toolStripButtons_Click(object sender, EventArgs e)
        {
_strategies.InitStrategies();

                        Thread thr = new Thread(Process);
                        thr.Priority = ThreadPriority.Normal;
                        thr.Start();
}
}
Собственно во вторую форму передается объект _strategies

Что еще вас интересует то??
Вопрос то в целом как в посторонней форме отслеживать любое изменение объекта в первой форме?

Конечно есть вариант сделать объект public но хотелось бы как нибудь по ссылке передавать.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 29.08.2013, 22:33   #8
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

Ваша проблема не в том что не передаётся объект - он передаётся верно и без всяких ref-ов. Проблема с тем, что вы назвали
Цитата:
отслеживать любое изменение объекта
Какое обновление? Что вы сейчас делаете чтобы его отслеживать? Вы про сами изменения не сказали вообще ничего, кроме факта их наличия. Скорее всего вы что-то не так написали в таймере/фоновом потоке, раз не видно изменений. Если вы не создавали ещё один объект StrategyCollection, значит там он тот же самый => ошибка в отображении обновлений. Как вы их определяете в дочерних формах?
Изобретатель велосипедов

Последний раз редактировалось Selestis; 29.08.2013 в 22:46.
Selestis вне форума Ответить с цитированием
Старый 30.08.2013, 08:29   #9
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Цитата:
Сообщение от Selestis Посмотреть сообщение
Ваша проблема не в том что не передаётся объект - он передаётся верно и без всяких ref-ов. Проблема с тем, что вы назвали
Какое обновление? Что вы сейчас делаете чтобы его отслеживать? Вы про сами изменения не сказали вообще ничего, кроме факта их наличия. Скорее всего вы что-то не так написали в таймере/фоновом потоке, раз не видно изменений. Если вы не создавали ещё один объект StrategyCollection, значит там он тот же самый => ошибка в отображении обновлений. Как вы их определяете в дочерних формах?
Да все нормуль... Нашел способ ... Все стало в сотни раз шустрее работать и процент выполнения выводится. В конструктор передаю объект StrategyCollection и внутри формы приравниваю локальной переменной. И таймер крутится постоянно.
Всем спасибо.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получение информации о процессе RibGeDx Visual C++ 2 13.04.2013 14:09
Вывод информации pqh PHP 7 15.04.2012 02:09
Информация о созданном процессе процессе Deathcore Помощь студентам 1 05.04.2011 19:54
Вывод информации в таблицу Desha Обсуждение статей 1 11.11.2009 13:21
Вывод информации из БД Alamez Помощь студентам 2 18.05.2009 10:07