Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 781

/ вопрос открыт /

Доброго времени суток, уважаемые эксперты!
В приложении я использую библиотеку VLC. у нее есть глюк - периодически она зависает при вызове ф-и инициализации VLC_Init. при этом, соответственно, мое приложение зависает на этапе инициализации. Как можно отследить это зависание приложения и перезапустить его если мы не вернулись из функции VLC_Init? Я даже теоретически не очень представляю что тут можно сделать без второй программы, которая должна запускать это приложение и следить, например, появилось ли его окно на экране.

AlexMPEI Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: AlexMPEI (статус: 1-ый класс)
Вопрос отправлен: 16 февраля 2010, 12:38
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 11; последнее сообщение — 24 февраля 2010, 19:49; участников в обсуждении: 3.
Alexey6522

Alexey6522 (статус: 1-ый класс), 16 февраля 2010, 14:51 [#1]:

Можно сделать проверку, если долгое время нет возврата из этой функции, тогда убить зависшее приложение и запустить его заново. Из вопроса я понял, ты используешь какую-то программу которая в которой находится данная функция VLC_Init и из своей программы ты ее в свою очередь вызываешь или как, что то я не совсем понял вопроса???
AlexMPEI

AlexMPEI (статус: 1-ый класс), 16 февраля 2010, 15:24 [#2]:

VLC - это довольно известный плеер ( http://www.videolan.org/ ). Я его использую в виде библиотеки в своем приложении libvlc. Чтобы начать работу с этой библиотекой ее надо проинициализировать, вызвав ф-ю VLC_Init. Проблема в том что не всегда мы возвращаемся из этой функции.
В том-то и дело что программа это одна - моя. Инициализация и использование библиотеки выполняется в главном потоке и я не знаю как мне узнать, работает моя программа или зависла, не используя какое-то стороннее приложение-наблюдатель. Но это, мне кажется, не очень красивое решение.
Alexey6522

Alexey6522 (статус: 1-ый класс), 16 февраля 2010, 15:40 [#3]:

Ты знаешь, как то раз я столкнулся с такой проблемой, мне нужно было остановить выполнение программы на какое-то время, с начало я использовал Sleep таким образом программа полностью засыпала и не отвечала какое-то время, тогда я попробовал использовать Timer ничего не получилось, потом мне посоветовали сделать отдельный поток и написать свою паузу в используя GetTickCount - Считывает вpемя, пpошедшее с момента запуска.может и тебе поможет
Alexey6522

Alexey6522 (статус: 1-ый класс), 16 февраля 2010, 15:44 [#4]:

Если ничего не понял из выше сказанного, тогда может тебе пройти по этой ссылке и посмотреть самому, как создавать многопоточные приложения, спасибо конечно не стоит говорить
http://www.delphibasics.ru/BeginThread.php

16 февраля 2010, 17:00: Вопрос перемещён из тематического раздела Delphi » Взаимодействие с Windows в раздел Delphi » Работа с компонентами и библиотеками модератором Ерёмин А.А. Причина: работа с _библиотеками_

AlexMPEI

AlexMPEI (статус: 1-ый класс), 16 февраля 2010, 17:44 [#5]:

Не согласен с перемещением - вопрос в том как отследить зависание программы и перезапустить ее принудительно, если она зависла на каком-то этапе выполнения - это взаимодействие с windows. А то что в данном случае она зависает при вызове какой-то функции какой-то библиотеки - частность. Я не прошу помочь пофиксить баг чужой библиотеки. Я думаю так.
AlexMPEI

AlexMPEI (статус: 1-ый класс), 16 февраля 2010, 17:49 [#6]:

Alexey6522, к сожалению, мне как раз не нужна остановка программы. Она происходит помимо моей воли, когда я просто не могу выйти из функции. Мой основной поток встает и больше никогда не продолжает работу. Вот я и спрашиваю, как мне понять что он встал, как мне убить этот процесс и запустить его заново? Но так чтобы все это было красиво :) Я не вижу здесь выхода в многопоточности...
Alexey6522

Alexey6522 (статус: 1-ый класс), 16 февраля 2010, 18:09 [#7]:

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

Егор (статус: 10-ый класс), 20 февраля 2010, 21:17 [#8]:

AlexMPEI:
ну, можно написать ещё одну программу, которая и будет запускать твою программу и, посылая сообщения, следить, зависла ли программа при запуске.
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
Alexey6522

Alexey6522 (статус: 1-ый класс), 21 февраля 2010, 21:52 [#9]:

А что если поместить функцию вызова VLC_Init в DLL и подключать ее во время работы программы???
Егор

Егор (статус: 10-ый класс), 22 февраля 2010, 08:17 [#10]:

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

ну, тогда только создавать отдельный поток. я только не понял, почему этот вариант не нравится?
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
AlexMPEI

AlexMPEI (статус: 1-ый класс), 24 февраля 2010, 19:49 [#11]:

Alexey6522: c dll не очень понял. суть та же самая, просто все функции будут в dll.

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

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:53
Выполнено за 0.02 сек.