|
Вопрос # 3 781/ вопрос открыт / |
|
Доброго времени суток, уважаемые эксперты!
В приложении я использую библиотеку VLC. у нее есть глюк - периодически она зависает при вызове ф-и инициализации VLC_Init. при этом, соответственно, мое приложение зависает на этапе инициализации. Как можно отследить это зависание приложения и перезапустить его если мы не вернулись из функции VLC_Init? Я даже теоретически не очень представляю что тут можно сделать без второй программы, которая должна запускать это приложение и следить, например, появилось ли его окно на экране.
 |
Вопрос задал: AlexMPEI (статус: 1-ый класс)
Вопрос отправлен: 16 февраля 2010, 12:38
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 11; последнее сообщение — 24 февраля 2010, 19:49; участников в обсуждении: 3.
|
Alexey6522 (статус: 1-ый класс), 16 февраля 2010, 14:51 [#1]:
Можно сделать проверку, если долгое время нет возврата из этой функции, тогда убить зависшее приложение и запустить его заново. Из вопроса я понял, ты используешь какую-то программу которая в которой находится данная функция VLC_Init и из своей программы ты ее в свою очередь вызываешь или как, что то я не совсем понял вопроса???
|
|
AlexMPEI (статус: 1-ый класс), 16 февраля 2010, 15:24 [#2]:
VLC - это довольно известный плеер ( http://www.videolan.org/ ). Я его использую в виде библиотеки в своем приложении libvlc. Чтобы начать работу с этой библиотекой ее надо проинициализировать, вызвав ф-ю VLC_Init. Проблема в том что не всегда мы возвращаемся из этой функции.
В том-то и дело что программа это одна - моя. Инициализация и использование библиотеки выполняется в главном потоке и я не знаю как мне узнать, работает моя программа или зависла, не используя какое-то стороннее приложение-наблюдатель. Но это, мне кажется, не очень красивое решение.
|
|
Alexey6522 (статус: 1-ый класс), 16 февраля 2010, 15:40 [#3]:
Ты знаешь, как то раз я столкнулся с такой проблемой, мне нужно было остановить выполнение программы на какое-то время, с начало я использовал Sleep таким образом программа полностью засыпала и не отвечала какое-то время, тогда я попробовал использовать Timer ничего не получилось, потом мне посоветовали сделать отдельный поток и написать свою паузу в используя GetTickCount - Считывает вpемя, пpошедшее с момента запуска.может и тебе поможет
|
|
Alexey6522 (статус: 1-ый класс), 16 февраля 2010, 15:44 [#4]:
Если ничего не понял из выше сказанного, тогда может тебе пройти по этой ссылке и посмотреть самому, как создавать многопоточные приложения, спасибо конечно не стоит говорить
http://www.delphibasics.ru/BeginThread.php
|
16 февраля 2010, 17:00: Вопрос перемещён из тематического раздела Delphi » Взаимодействие с Windows в раздел Delphi » Работа с компонентами и библиотеками модератором Ерёмин А.А. Причина: работа с _библиотеками_
|
AlexMPEI (статус: 1-ый класс), 16 февраля 2010, 17:44 [#5]:
Не согласен с перемещением - вопрос в том как отследить зависание программы и перезапустить ее принудительно, если она зависла на каком-то этапе выполнения - это взаимодействие с windows. А то что в данном случае она зависает при вызове какой-то функции какой-то библиотеки - частность. Я не прошу помочь пофиксить баг чужой библиотеки. Я думаю так.
|
|
AlexMPEI (статус: 1-ый класс), 16 февраля 2010, 17:49 [#6]:
Alexey6522, к сожалению, мне как раз не нужна остановка программы. Она происходит помимо моей воли, когда я просто не могу выйти из функции. Мой основной поток встает и больше никогда не продолжает работу. Вот я и спрашиваю, как мне понять что он встал, как мне убить этот процесс и запустить его заново? Но так чтобы все это было красиво Я не вижу здесь выхода в многопоточности...
|
|
Alexey6522 (статус: 1-ый класс), 16 февраля 2010, 18:09 [#7]:
блинииииииин, я привел тебе пример из собственного опыта, если у меня не получилось с функцией Sleep я использовал другую, я дал тебе ссылку, в конце концов поищи в гугле как создавать многопоточные приложения, если ты не совсем понял объясняю, когда зависает или ты сам намеренно останавливаешь один поток, то друге потоки еще работают, в них то и можно сделать проверку завис тот поток или нет
|
|
Егор (статус: 10-ый класс), 20 февраля 2010, 21:17 [#8]:
AlexMPEI:
ну, можно написать ещё одну программу, которая и будет запускать твою программу и, посылая сообщения, следить, зависла ли программа при запуске.
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
Alexey6522 (статус: 1-ый класс), 21 февраля 2010, 21:52 [#9]:
А что если поместить функцию вызова VLC_Init в DLL и подключать ее во время работы программы???
|
|
Егор (статус: 10-ый класс), 22 февраля 2010, 08:17 [#10]:
а если попробовать в начале таймер поставить, который через некоторое время запустится, проверит значение флага (флаг должен быть сброшен основной программой) и если флаг всё ещё установлен, то перезапускает приложение?
хотя... если основной поток умирает, возможно, что управление по таймеру передано не будет...
ну, тогда только создавать отдельный поток. я только не понял, почему этот вариант не нравится?
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
AlexMPEI (статус: 1-ый класс), 24 февраля 2010, 19:49 [#11]:
Alexey6522: c dll не очень понял. суть та же самая, просто все функции будут в dll.
Егор: можно более подробно данную идею с таймером? таймер же тоже в основном потоке работает. если основной поток завис на какой-то функции, то мы не войдем в событие таймера. или я что-то не так понял?
этот вариант (с потоком) походу остается единственным жизнеспособным вариантом. Не знаю как приложению сначала закрыть само себя, а потом перезапустить.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|