Проблема с титровальным сервером в собственной программе
Модераторы: ElenVR, Людмила, PR
-
- Сообщения: 90
- Зарегистрирован: 04 сен 2008 01:50
- Откуда: Красноярск
Проблема с титровальным сервером в собственной программе
Здравствуйте!
Имеем два ПО собственного изготовления, которые используют титровальный сервер. Если обе программы запустить на одном сервере, а через некоторое время одну из них закрыть, то вторая тоже перестает работать.
Если после сбоя закрыть вторую программу и отркыть снова, то она работает нормально.
Я подозреваю, что проблема в освобождении объекта CLSID_SLTitleTarget, который освобождается через Release в обоих программах при их закрытии. Подскажите, пожалуйста, это баг или фича? В описании SDK ничего не нашел по этому поводу...
И как мне решить эту проблему? Что будет, если я просто оставлю ссылку на этот объект? Не будет ли утечки ссылок? Логика подсказывает, что этот класс реализован в виде синглетона и ничего страшного от "зависшей" ссылки не произойдет, но хотелось бы официального подтверждения.
Спасибо.
Имеем два ПО собственного изготовления, которые используют титровальный сервер. Если обе программы запустить на одном сервере, а через некоторое время одну из них закрыть, то вторая тоже перестает работать.
Если после сбоя закрыть вторую программу и отркыть снова, то она работает нормально.
Я подозреваю, что проблема в освобождении объекта CLSID_SLTitleTarget, который освобождается через Release в обоих программах при их закрытии. Подскажите, пожалуйста, это баг или фича? В описании SDK ничего не нашел по этому поводу...
И как мне решить эту проблему? Что будет, если я просто оставлю ссылку на этот объект? Не будет ли утечки ссылок? Логика подсказывает, что этот класс реализован в виде синглетона и ничего страшного от "зависшей" ссылки не произойдет, но хотелось бы официального подтверждения.
Спасибо.
-
- Сообщения: 7093
- Зарегистрирован: 26 фев 2004 09:53
- Откуда: Techsupport SoftLab-NSK
Разработчики, которые отвечают за данное направление, сейчас в отпуске. Появятся ближе к середине следующей недели.
Пока хотелось бы получить какие-нибудь подробности.
А именно:
1)Какая версия нашего ПО используется? Как посмотреть: http://www.softlab-nsk.com/rus/forward/qna.html#a2_14
2)Было бы здорово если бы вы прислали фрагменты кода где создается объект и где он уничтожается. Присылайте на адрес техподдержки:
forward@softlab.tv
forward@sl.iae.nsk.su
forward@softlab-nsk.com
В письме укажите, пожалуйста, ссылку на этот топик.
Пока хотелось бы получить какие-нибудь подробности.
А именно:
1)Какая версия нашего ПО используется? Как посмотреть: http://www.softlab-nsk.com/rus/forward/qna.html#a2_14
2)Было бы здорово если бы вы прислали фрагменты кода где создается объект и где он уничтожается. Присылайте на адрес техподдержки:
forward@softlab.tv
forward@sl.iae.nsk.su
forward@softlab-nsk.com
В письме укажите, пожалуйста, ссылку на этот топик.
-
- Сообщения: 90
- Зарегистрирован: 04 сен 2008 01:50
- Откуда: Красноярск
-
- Сообщения: 493
- Зарегистрирован: 04 янв 2004 12:45
- Откуда: СофтЛаб-НСК
Во-первых, про проблему - это не фича. Клиенты титровального ядра работают независимо, поэтому закрытие одной программы никак не сказывается на работе второй программы. Скорее всего это косвенные связи работы программ. В первую очередь проверьте, что после закрытия первой программы продолжает нормально работать цикл выкладывания картинок (кадров) в фифо во второй программе. Например, поставьте отладочную печать и убедитесь, что картинки с тем же темпом выкладываются в фифо.
Во-вторых, не могли бы Вы сделать две простенькие программы, которые бы повторяли ошибку и прислать эти программы с исходниками мне? Это бы очень ускорило решение проблемы.
Если нет, то прийдется задавать разные вопросы, чтобы понять что именно не работает:
1) К какому титровальному объекту Вы подключаетесь в программах. Дайте CLSID этого объекта, например,
2) Вы работете с именованованным или с обычным титровальным регионом?
3) Пользуетесь ли Вы методом KeepAlive() ?
4) Объясните подробнее что именно перестает работать, то есть какая из наших функций начинает возвращать ошибку и какую? А если все возвращают S_OK, то что идет не так, как должно идти? Например: регион показывал статичную картинку (в фифо второй программы был положен кадр с номером, время которого уже прошло) и при закрытии первой программы эта картинка перестала быть видна на экране.
Во-вторых, не могли бы Вы сделать две простенькие программы, которые бы повторяли ошибку и прислать эти программы с исходниками мне? Это бы очень ускорило решение проблемы.
Если нет, то прийдется задавать разные вопросы, чтобы понять что именно не работает:
1) К какому титровальному объекту Вы подключаетесь в программах. Дайте CLSID этого объекта, например,
Код: Выделить всё
extern "C" const GUID CLSID_SLDirectShowTitleEngine = {0x73DA552F,0x4946,0x4670,{0x84,0x84,0x95,0x8F,0x97,0xA2,0x23,0xF2}};
3) Пользуетесь ли Вы методом KeepAlive() ?
4) Объясните подробнее что именно перестает работать, то есть какая из наших функций начинает возвращать ошибку и какую? А если все возвращают S_OK, то что идет не так, как должно идти? Например: регион показывал статичную картинку (в фифо второй программы был положен кадр с номером, время которого уже прошло) и при закрытии первой программы эта картинка перестала быть видна на экране.
-
- Сообщения: 90
- Зарегистрирован: 04 сен 2008 01:50
- Откуда: Красноярск
-
- Сообщения: 493
- Зарегистрирован: 04 янв 2004 12:45
- Откуда: СофтЛаб-НСК
Ошибка здесь:
Объект создается "на стеке", поэтому после выхода из функции он автоматически удалится. Соответственно при проверке "жизнеспособности" всех регионов, которые были созданы с его участием титровальное ядро обратится к этому объекту, обнаружит, что его уже нет и закроет эти регионы - программа перестанет работать. Проверка жизнеспособности делается редко (например, при закрытии клиента титровального ядра), поэтому второй экземпляр перестает работать именно при закрытии первого экземпляра программы. Но на самом деле, программа может перестать работать и в других случаях.
Предлагаю сделать объект "holder" переменной класса (как объект "_region"), чтобы он закрывался только при отключении от титровального ядра.
Код: Выделить всё
// create COM-object for application alive checking
CComPtr<IUnknown> holder;
THROW_FAILED(holder.CoCreateInstance(CLSID_SLResourceHolder),
_T("Не удалось создать экземпляр SLResourceHolder"));
Предлагаю сделать объект "holder" переменной класса (как объект "_region"), чтобы он закрывался только при отключении от титровального ядра.
-
- Сообщения: 90
- Зарегистрирован: 04 сен 2008 01:50
- Откуда: Красноярск
-
- Сообщения: 2311
- Зарегистрирован: 05 мар 2003 19:21
-
- Сообщения: 90
- Зарегистрирован: 04 сен 2008 01:50
- Откуда: Красноярск
-
- Сообщения: 493
- Зарегистрирован: 04 янв 2004 12:45
- Откуда: СофтЛаб-НСК
Проблема в том, что Вы создаете событие (Event) для остановки рабочего потока с одним и тем же именем во всех экземплярах программ, поэтому когда выходит любой экземпляр программы, он "взводит событие" для всех программ. Все программы обнаруживают, что надо остановиться и перестают работать.
Надо исправить:
на
и все заработает как надо.
Надо исправить:
Код: Выделить всё
_stopEvent = ::CreateEvent(0, TRUE, FALSE, _T("Render thread stop event"));
Код: Выделить всё
_stopEvent = ::CreateEvent(0, TRUE, FALSE, NULL);
-
- Сообщения: 90
- Зарегистрирован: 04 сен 2008 01:50
- Откуда: Красноярск
Спасибо огромное за помощь! Проблема решена. Это ж надо было в одном проекте допустить две ошибки, которые приводили к одному "результату". Профессионализм не пропьешь, чо
ЗЫ: за всю свою практику никогда не использовал именованные события, окромя последнего проекта, где используется ваш титровальный сервер. И надо же было код скопипастить в тестовый проект именно оттуда...

ЗЫ: за всю свою практику никогда не использовал именованные события, окромя последнего проекта, где используется ваш титровальный сервер. И надо же было код скопипастить в тестовый проект именно оттуда...