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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы существования формы и COM обьектов 
:(
    Опции темы
Stratus
Дата 1.12.2009, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Коллеги

столкнулся с вопросом совместного существования Обьектов формы и COM обьектов и отношений между ними.....
Идея: нужно чтобы на графике формы отрисовывалось значение которое приходит по событию от COM сервера
Проблема в том, чтопосле 4-5 событий отрисовка на графике останавливается, события не принимаются, хотя сервер их передает. Если выводить эти события в конслоль то все нормально.
Есть предположение, что что это может быть взаимоблокировка потоков либо обьект COM клиента был уничтожен сборщиком мусора...

Реализация:
Код

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            //создаем экземпляр COM обьекта (клиент)
        }
       
       void обработчик_события(значение)
      {
    //передаем графику (который является обьектом формы) значение 
       }
}


Вопросы:
1.Имеет ли смысл создать отдельный поток, возможно из-зи это го какой то конфликт?
2.Правильно ли создавать экземпляр ком обьекта сразу после инициализации формы?
3.Лучше ли создавать обьект Клиент в классе формы или лучше в другом классе?
PM MAIL   Вверх
explorer
Дата 1.12.2009, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



1. Не нужно городить огород из потоков там, где это не требуется. С потоком проблем только прибавится.
2. Может все-таки это сервер,  а не клиент? Клиент - это приложение (в данном случае), которое как раз и обращается и обрабатывает события сервера.  Поэтому создавать экземпляр сервера надо как раз вместе с клиентом, но не раншье (это и не получится, так что здесь тоже все в норме).
3. Создавать лучше там, где потом планируется использовать. Создание в другом классе имеет смысл только тогда, когда нужно предваорительно обработать передаваемые / получаемые значения.  

Сборщик мусора может удалить что-то только тогда, когда на это не существует никаких ссылок. А раз сервер продолжает вывод (консоль принимает данные), то никакого удаления не было smile

А сам копонент, рисующий график, не мог "подвиснуть"? Кода, как такогого. нет, поэтому сложно сказать что-то определенное.
--------------------
 
PM MAIL WWW ICQ   Вверх
Stratus
Дата 1.12.2009, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(explorer @  1.12.2009,  11:20 Найти цитируемый пост)
2. Может все-таки это сервер,  а не клиент? 

Неа. Сервер работает нормально, если не выводить на график а только на консоль то все нормально работает....


Цитата(explorer @  1.12.2009,  11:20 Найти цитируемый пост)
А сам копонент, рисующий график, не мог "подвиснуть"? 

График подвиснуть тоже не мог так как до это го я пробовал его рисовать по таймеру и все было ок.

Тут именно сочетание ком Клиента и вывод на график дают какой то  затык. 
Как отмониторить непойму, или как код переписать правильно....
PM MAIL   Вверх
explorer
Дата 2.12.2009, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Обработка компонентом события быстро происходит? Как часто вызывается событие? Может ли получиться так, что события поступают еще до завершения обработки предыдущих. Не имеет ли смысла изменить архитектуру так, чтобы клиент сам дергал СОМ-сервер по мере надобности, а не наоборот, как сейчас? 
--------------------
 
PM MAIL WWW ICQ   Вверх
tol05
Дата 2.12.2009, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



А взаимодействие с COM-объектом из какого потока идет? И в каком потоке создается COM-объект?
В основном потоке формы или в дополнительном рабочем потоке?


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


Шустрый
*


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

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



Цитата(explorer @  2.12.2009,  13:33 Найти цитируемый пост)
Обработка компонентом события быстро происходит? Как часто вызывается событие? Может ли получиться так, что события поступают еще до завершения обработки предыдущих. Не имеет ли смысла изменить архитектуру так, чтобы клиент сам дергал СОМ-сервер по мере надобности, а не наоборот, как сейчас?  

Событие может происходить достаточно быстро, например несколько раз в секунду. 
Сама ситуация выглядит так как только в код добавляещь строку прорисовывать на график то на графике и вконсоли начинают отображаться значения первых четырех событий ... а потом все программа реагирует на управления обьектами формы, но значения нерисуются и на консоль не выводятся. Если отключить вывод на график то в консоли отображаются все события.
Вот мне непонятно как отмониторить средствами VS ситуацию когда событие может поступить до завершения обработки компонентом значения. Есть какие нибудь идеи на этот счет?


Цитата(tol05 @  2.12.2009,  15:05 Найти цитируемый пост)
А взаимодействие с COM-объектом из какого потока идет? И в каком потоке создается COM-объект?
В основном потоке формы или в дополнительном рабочем потоке? 


Взаимодествие и создание обьекта идет из потока формы.

Я вот думаю может есть какая то особбенность в программировании COM взаимодействия?!
PM MAIL   Вверх
Экскалупатор
Дата 3.12.2009, 02:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

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



так а как идея дергать сервер из программы? как диспетчер задач в винде, он же график рисует не потому что винда говорит что что то изменилось, а потому что он опрашивает через какой то интервал, и результат рисуется...

Цитата

Вот мне непонятно как отмониторить средствами VS ситуацию когда событие может поступить до завершения обработки компонентом значения. Есть какие нибудь идеи на этот счет?


надо организовать какой то буфер(очередь) куда будут помещаться значения и откуда будут потом рисоваться. буфер должен быть таким что бы значения попавшие в него первыми обрабатывались программой раньше. а программа будет при рисовании дергать значения из этой очереди. соответственно программа будет постоянно рисовать не потому что ее дернул сервер, а по какому то времени. что избавит от этой проблемы(скорее всего)
PM MAIL ICQ   Вверх
Stratus
Дата 3.12.2009, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Экскалупатор @  3.12.2009,  02:31 Найти цитируемый пост)
так а как идея дергать сервер из программы?

Дергать сервер не получиться. Разработчик третье лицо и в COM бибилиотеках запрос сервера не предусмотрен, так что на эту ситуацию я повлиять не могу.

Цитата(Экскалупатор @  3.12.2009,  02:31 Найти цитируемый пост)
как диспетчер задач в винде, он же график рисует не потому что винда говорит что что то изменилось, а потому что он опрашивает через какой то интервал, и результат рисуется...

Возможно, но насколько я знаю. Приложение Виндоус Формс от Консольного отличается как раз тем, что консольное приложение запрашивает операционную систему - не произошло ли событие, а в приложении Виндоус Формс, как раз набооборот, ОС инициирует событие и дает сообщение приложению.

Вообще весь смысл - понять почему так происходит: то ли компонент - график не успевает обрабатывать события, то ли идет конфликт между компонентом .NET и и COM обьектом так как они из разных сред???


Цитата(Экскалупатор @  3.12.2009,  02:31 Найти цитируемый пост)
надо организовать какой то буфер(очередь) куда будут помещаться значения и откуда будут потом рисоваться. буфер должен быть таким что бы значения попавшие в него первыми обрабатывались программой раньше. а программа будет при рисовании дергать значения из этой очереди. соответственно программа будет постоянно рисовать не потому что ее дернул сервер, а по какому то времени. что избавит от этой проблемы(скорее всего) 

я раньше делал структуру которая использовалась в качестве хранилища данных, но тут возникает геморрой по выявлению уже отрисованных значений и неотрисованных графиком значений (может метку какуюнибудь ставить)......
но опять же хочется понять почемму компонент неотрабатывает все событиия, ведь даже ошибки не возникает.....
PM MAIL   Вверх
Экскалупатор
Дата 3.12.2009, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

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



Stratus, скорее всего проблема у тебя в том что форма не успевает отрисовать старые значения как уже приходится рисовать новые. в консоли такой проблемы нету потому что там ничего не рисуется.

я думаю если бы проблема была между ".NET и COM" то оно и в консоли бы не работало.

Цитата

как раз набооборот, ОС инициирует событие и дает сообщение приложению.


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

Цитата

но тут возникает геморрой по выявлению уже отрисованных значений и неотрисованных графиком значений


можно просто удалять уже отрисованные значения из очереди поступивших, и переносить их в какой то массив из которого они будут рисоваться на форме. мне кажется тебе нужно просто немного больше времени дать приложению для рисования.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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