![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
Stratus |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 27.5.2009 Репутация: нет Всего: нет |
Коллеги
столкнулся с вопросом совместного существования Обьектов формы и COM обьектов и отношений между ними..... Идея: нужно чтобы на графике формы отрисовывалось значение которое приходит по событию от COM сервера Проблема в том, чтопосле 4-5 событий отрисовка на графике останавливается, события не принимаются, хотя сервер их передает. Если выводить эти события в конслоль то все нормально. Есть предположение, что что это может быть взаимоблокировка потоков либо обьект COM клиента был уничтожен сборщиком мусора... Реализация:
Вопросы: 1.Имеет ли смысл создать отдельный поток, возможно из-зи это го какой то конфликт? 2.Правильно ли создавать экземпляр ком обьекта сразу после инициализации формы? 3.Лучше ли создавать обьект Клиент в классе формы или лучше в другом классе? |
|||
|
||||
explorer |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 104 Регистрация: 26.2.2008 Репутация: 1 Всего: 2 |
1. Не нужно городить огород из потоков там, где это не требуется. С потоком проблем только прибавится.
2. Может все-таки это сервер, а не клиент? Клиент - это приложение (в данном случае), которое как раз и обращается и обрабатывает события сервера. Поэтому создавать экземпляр сервера надо как раз вместе с клиентом, но не раншье (это и не получится, так что здесь тоже все в норме). 3. Создавать лучше там, где потом планируется использовать. Создание в другом классе имеет смысл только тогда, когда нужно предваорительно обработать передаваемые / получаемые значения. Сборщик мусора может удалить что-то только тогда, когда на это не существует никаких ссылок. А раз сервер продолжает вывод (консоль принимает данные), то никакого удаления не было ![]() А сам копонент, рисующий график, не мог "подвиснуть"? Кода, как такогого. нет, поэтому сложно сказать что-то определенное. --------------------
|
|||
|
||||
Stratus |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 27.5.2009 Репутация: нет Всего: нет |
Неа. Сервер работает нормально, если не выводить на график а только на консоль то все нормально работает.... График подвиснуть тоже не мог так как до это го я пробовал его рисовать по таймеру и все было ок. Тут именно сочетание ком Клиента и вывод на график дают какой то затык. Как отмониторить непойму, или как код переписать правильно.... |
|||
|
||||
explorer |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 104 Регистрация: 26.2.2008 Репутация: 1 Всего: 2 |
Обработка компонентом события быстро происходит? Как часто вызывается событие? Может ли получиться так, что события поступают еще до завершения обработки предыдущих. Не имеет ли смысла изменить архитектуру так, чтобы клиент сам дергал СОМ-сервер по мере надобности, а не наоборот, как сейчас?
--------------------
|
|||
|
||||
tol05 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 63 Всего: 170 |
А взаимодействие с COM-объектом из какого потока идет? И в каком потоке создается COM-объект?
В основном потоке формы или в дополнительном рабочем потоке? -------------------- На хорошей работе и сны хорошие снятся. |
|||
|
||||
Stratus |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 27.5.2009 Репутация: нет Всего: нет |
Событие может происходить достаточно быстро, например несколько раз в секунду. Сама ситуация выглядит так как только в код добавляещь строку прорисовывать на график то на графике и вконсоли начинают отображаться значения первых четырех событий ... а потом все программа реагирует на управления обьектами формы, но значения нерисуются и на консоль не выводятся. Если отключить вывод на график то в консоли отображаются все события. Вот мне непонятно как отмониторить средствами VS ситуацию когда событие может поступить до завершения обработки компонентом значения. Есть какие нибудь идеи на этот счет?
Взаимодествие и создание обьекта идет из потока формы. Я вот думаю может есть какая то особбенность в программировании COM взаимодействия?! |
|||
|
||||
Экскалупатор |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1746 Регистрация: 1.4.2009 Где: г. Минск Репутация: 11 Всего: 24 |
так а как идея дергать сервер из программы? как диспетчер задач в винде, он же график рисует не потому что винда говорит что что то изменилось, а потому что он опрашивает через какой то интервал, и результат рисуется...
надо организовать какой то буфер(очередь) куда будут помещаться значения и откуда будут потом рисоваться. буфер должен быть таким что бы значения попавшие в него первыми обрабатывались программой раньше. а программа будет при рисовании дергать значения из этой очереди. соответственно программа будет постоянно рисовать не потому что ее дернул сервер, а по какому то времени. что избавит от этой проблемы(скорее всего) |
|||
|
||||
Stratus |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 72 Регистрация: 27.5.2009 Репутация: нет Всего: нет |
Дергать сервер не получиться. Разработчик третье лицо и в COM бибилиотеках запрос сервера не предусмотрен, так что на эту ситуацию я повлиять не могу. Возможно, но насколько я знаю. Приложение Виндоус Формс от Консольного отличается как раз тем, что консольное приложение запрашивает операционную систему - не произошло ли событие, а в приложении Виндоус Формс, как раз набооборот, ОС инициирует событие и дает сообщение приложению. Вообще весь смысл - понять почему так происходит: то ли компонент - график не успевает обрабатывать события, то ли идет конфликт между компонентом .NET и и COM обьектом так как они из разных сред??? я раньше делал структуру которая использовалась в качестве хранилища данных, но тут возникает геморрой по выявлению уже отрисованных значений и неотрисованных графиком значений (может метку какуюнибудь ставить)...... но опять же хочется понять почемму компонент неотрабатывает все событиия, ведь даже ошибки не возникает..... |
|||
|
||||
Экскалупатор |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1746 Регистрация: 1.4.2009 Где: г. Минск Репутация: 11 Всего: 24 |
Stratus, скорее всего проблема у тебя в том что форма не успевает отрисовать старые значения как уже приходится рисовать новые. в консоли такой проблемы нету потому что там ничего не рисуется.
я думаю если бы проблема была между ".NET и COM" то оно и в консоли бы не работало.
но ты же можешь заставить приложение делать что то раньше винды... я имею ввиду что не обязательно ждать сообщения, можно самому проверить, на самом деле окошки от консоли отличаются выводом для пользователя, отсюда и ожидание событий от системы, как ты без системы будешь взаимодействовать с интерфейсом?
можно просто удалять уже отрисованные значения из очереди поступивших, и переносить их в какой то массив из которого они будут рисоваться на форме. мне кажется тебе нужно просто немного больше времени дать приложению для рисования. |
||||
|
|||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |