Вопросы по SLMessageSample_C#

Здесь обсуждаются любые продукты компании СофтЛаб-НСК для телевизионного вещания (Форвард Т, Форвард ТС, Форвард Голкипер, Форвард Рефери, Форвард Офис, Форвард Инжест)

Модераторы: Людмила, PR, vd, Даниленко Сергей

Ответить
eXed
Сообщения: 330
Зарегистрирован: 28 окт 2005 01:08
Откуда: Irkutsk
Контактная информация:

Вопросы по SLMessageSample_C#

Сообщение eXed »

Искал на форуме упоминания, но не нашел. Поэтому решил открыть отдельную ветку.

Источник сабжа:
ftp://ftp.sl.iae.nsk.su/Public/ForwardT ... verSDK.zip

Сообщение относится только к работе с библиотекой Interop.SLMessageServerLib.dll, прошу сильно не критиковать, в данном направлении (клиент-сервер) я нуб.

1. Во время тестирования, столкнулся с ситуацией - приложение закрыто, открываю снова - и во время выполнения _connection.CreateQueue(...); Вылезла ошибка mcQueueExist. В связи с этим вопрос, как убить все, чтобы избежать данной ошибки?
_connection = null;? В свойствах объекта функции типа Dispose не нашел. В вашем примере при выходе ничего подобного не делается.
Во время отладки нажал - стоп, очередь осталась, существует ли возможность ее закрыть?

2. При вводе Заведомо неверного имени компа - никакой ошибки при создании очереди не пишется. Все проходит на mcSuccess. Вопрос так и задумано или всетаки функция малость недоделана?

3. При вводе IP адреса в поле имя компьютера - создается бесконечный цикл. На сервер отправляется бесконечное кол-во команд.

4. Опрос состояния приложения FDOnAir.
"Поле сообщения "Body" содержит список запрашиваемых параметров, разделенных переводом строки." - Удобная вещь, почему нельзя отправлять команды пачками через перенос? Если сабжект = OnAir1.Mirror и я подсовываю несколько команд, то выполняется только первая, а так хочется все сделать одним махом : )
Игорь Таранцев
Сообщения: 493
Зарегистрирован: 04 янв 2004 12:45
Откуда: СофтЛаб-НСК

Сообщение Игорь Таранцев »

1. Сборщик мусора в C# не удаляет объекты сразу, как только их освободили. В итоге освобожденный COM-объект "очередь" остается существовать и новая очередь не создается. Есть два варианта:
а) вызывать удаление всего "мусора" вручную через System.GC.Collect();
б) удалять объект вручную, перед обнулением последней ссылки:
if (_titleComObject != null) Marshal.ReleaseComObject(_titleComObject);
_titleComObject = null;
только при этом надо быть уверенным, что ссылка последняя, иначе COM-объект удалится, а ссылка на него останется и потом будет взрыв.
А вообще-то лучше всего создваать очередь один раз и удалять ее только при выходе из программы.

2. Видимо речь идет про отправку сообщения.
Действительно, посылка сообщения проходит успешно и возвращается результат mcSuccess, поскольку сообщение успешно доставлено до локального сервера. Далее локальный сервер посылает сообщение другому серверу и если он не сможет этого сделать, то он пошлет в ответ сообщение об ошибке. Далее удаленный сервер пошлет сообщение в конкретную очередь и если это не получится, то прийдет сообщение об ошибке. Так что в Вашем случае уже после отправки сообщения должно приходить другое сообщение (в ответ), что произошла ошибка доставки такого-то сообщения.

3. Будем проверять, если ошибка повторится, то будем править.

4. Да, можно отрабатывать несколько команд одновременно, но если кто-то пошлет сразу две сотни команд, то OnAir будет отрабатывать эти команды по очереди и не будет просматривать и исполнять расписание. В итоге может возникнуть ситуация, когда очередное задание выполнится не вовремя. Для нас это очень критично, поэтому мы специально запретили отработку нескольких команд.
eXed
Сообщения: 330
Зарегистрирован: 28 окт 2005 01:08
Откуда: Irkutsk
Контактная информация:

Сообщение eXed »

А вообще-то лучше всего создваать очередь один раз и удалять ее только при выходе из программы.
Дело в чем, у меня 6 компов, как лучше им всем слать команды и в какой последовательности иницилизировать соединения? Создавать сразу 6 соединений? И потом работать с разными коннектами или работать с одним коннектом, но для этого нужно убивать предидущий контакт.

-----
Класс для работы с SLMSConnection я вывел за пределы класса формы. Но если работать с коллекцией коннектов, то не придумал еще, как быть с функцией
protected override void DefWndProc(ref Message m)
чтобы каждому объекту свой ответ приходил.
Игорь Таранцев
Сообщения: 493
Зарегистрирован: 04 янв 2004 12:45
Откуда: СофтЛаб-НСК

Сообщение Игорь Таранцев »

Вам не нужно создавать 6 соединений. Достаточно одного соединения, поскольку Вы соединяетесь ТОЛЬКО с локальным сервером. Когда вы посылаете сообщение, вы указываете, кому его нужно доставить, но само сообщение всегда посылается именно локальному серверу. Локальный сервер проверяет имя компьютера и пересылает сообщение кому нужно.
А вот команды надо слать каждому OnAir-у по очереди. Прийдется дублировать каждую команду по 6 раз.
Ответы в любом случае будут приходить в одну очередь. Но у каждого ответа указывается номер сообщения, на которое и пришел ответ. Надо присваивать каждому сообщению уникальный номер (например, пусть младшая цифра всегда от 1 до 6 - дает номер OnAir-а).
Ответить