Russian Qt Forum
Ноябрь 24, 2024, 21:57
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Общие вопросы
>
Библиотека-убийца
Страниц: [
1
]
2
3
4
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Библиотека-убийца (Прочитано 23154 раз)
OKTA
Гость
Библиотека-убийца
«
:
Апрель 11, 2014, 17:14 »
Товарищи, подскажите, как лучше поступить в следующей ситуации.
Подключаю через QLibrary библиотеку. Нахожу в ней адрес нужной мне функции, через которую все операции с этой библиотекой происходят и начинаю с ней работать. Структура библиотеки едина, но самих таких библиотек может быть несколько.
И иногда встречаются случаи, когда чьи-то кривые руки сделали эту библиотеку не по стандарту.. Вызываю функцию библиотеки, а она, собака, стопорит поток, не возвращая значение. Я знаю, что этого быть не должно и в этом случае надо прервать все работы с этой библиотекой. Каким образом лучше всего это сделать?
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Библиотека-убийца
«
Ответ #1 :
Апрель 11, 2014, 17:16 »
Параллельно с вызовом функции библиотеки запустить таймер (возможно в другом потоке), и если по истечении времени таймера выхода их функции нет, то сообщать об этом.
Записан
OKTA
Гость
Re: Библиотека-убийца
«
Ответ #2 :
Апрель 11, 2014, 17:22 »
Таймер да, о нем я тоже подумал. Но он только даст сигнал, что "что-то не так с библиотекой". Вопрос в том, как можно ее безопасно выгрузить? Простой unload убьет всю программу целиком, т.к. к моменту, когда происходит это зависание, уже много чего инициализировано в памяти самой этой библиотекой (и к этим данным не достучаться)
Записан
kamre
Частый гость
Offline
Сообщений: 233
Re: Библиотека-убийца
«
Ответ #3 :
Апрель 11, 2014, 19:13 »
Цитата: OKTA от Апрель 11, 2014, 17:14
в этом случае надо прервать все работы с этой библиотекой. Каким образом лучше всего это сделать?
В отдельном процессе запускать функции библиотеки, а если что, то прибивать процесс.
Записан
OKTA
Гость
Re: Библиотека-убийца
«
Ответ #4 :
Апрель 11, 2014, 20:34 »
Это уже не просто функции библиотеки запускать в отдельном процессе, а приложение отдельное делать, которое будет работать с библиотеками
а это жесть, учитывая специфику этих библиотек.
Записан
Bepec
Гость
Re: Библиотека-убийца
«
Ответ #5 :
Апрель 11, 2014, 21:54 »
Почему приложение? Говорите уж тогда специфику, тогда мб что придумаем
Записан
Alex Custov
Джедай : наставник для всех
Offline
Сообщений: 2063
Re: Библиотека-убийца
«
Ответ #6 :
Апрель 11, 2014, 21:59 »
Цитата: Bepec от Апрель 11, 2014, 21:54
Почему приложение? Говорите уж тогда специфику, тогда мб что придумаем
Просто интересно - а как функцию из библиотеки можно запустить в отдельном процессе без написания ещё одной программы-обёртки?
Записан
Bepec
Гость
Re: Библиотека-убийца
«
Ответ #7 :
Апрель 12, 2014, 13:47 »
псевдокод.
Код:
::CreateThread(blabla, названиефункции).
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Библиотека-убийца
«
Ответ #8 :
Апрель 12, 2014, 15:02 »
Цитата: Bepec от Апрель 12, 2014, 13:47
псевдокод.
Код:
::CreateThread(blabla, названиефункции).
Это запуск в отдельной нитке, того же процесса.
Записан
Bepec
Гость
Re: Библиотека-убийца
«
Ответ #9 :
Апрель 12, 2014, 15:20 »
Виноват, невнимательно прочитал.
Довольно сложно, но можно. Идём в чужой процесс, залазим к нему в память, разворачиваем там свой лагерь и что угодно делаем. Но это для проблемы уже слишком масштабно. Ммм... да, видел где то инициацию форка эксплорера, правда для других задач, но в качестве расходного процесса пойдёт
А если своя обертка, просто локальные сокеты и запуск отдельного процесса со связью.
PS у меня есть опыт в этой области, но она "на грани" разумного
Записан
xokc
Птица говорун
Offline
Сообщений: 976
Re: Библиотека-убийца
«
Ответ #10 :
Апрель 13, 2014, 08:42 »
Цитата: OKTA от Апрель 11, 2014, 20:34
Это уже не просто функции библиотеки запускать в отдельном процессе, а приложение отдельное делать, которое будет работать с библиотеками
а это жесть, учитывая специфику этих библиотек.
К сожалению ничего умнее, чем делать отдельное приложение, которое будет грузить эти библиотеки и взаимодействовать через IPC с главным приложением выдумать не получится - не зря в Хроме для того, чтобы обесчестить независимость (в смысле стабильности) от плагинов каждая вкладка как отдельный процесс реализована.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Библиотека-убийца
«
Ответ #11 :
Апрель 13, 2014, 09:37 »
Цитата: OKTA от Апрель 11, 2014, 17:14
Я знаю, что этого быть не должно и в этом случае надо прервать все работы с этой библиотекой. Каким образом лучше всего это сделать?
"вынести в процесс" - удовольствие дорогое. Интересно попробовать механизм передачи исключений между нитками. В Qt 5 что-то есть (не вникал)
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Библиотека-убийца
«
Ответ #12 :
Апрель 13, 2014, 10:18 »
Цитата: Igors от Апрель 13, 2014, 09:37
"вынести в процесс" - удовольствие дорогое.
Да.
Но процесс мы можем убить без последствия для других процессов, а вот нитку для процесса не всегда.
Цитата: Igors от Апрель 13, 2014, 09:37
Интересно попробовать механизм передачи исключений между нитками. В Qt 5 что-то есть (не вникал)
А какой в этом смысл? Если бы функция из библиотеки могла сама определять, что она зависла, то ей не обязательно было бросать исключение, достаточно просто завершаться.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Библиотека-убийца
«
Ответ #13 :
Апрель 13, 2014, 11:14 »
Цитата: Old от Апрель 13, 2014, 10:18
А какой в этом смысл? Если бы функция из библиотеки могла сама определять, что она зависла, то ей не обязательно было бросать исключение, достаточно просто завершаться.
Смысл "прерваться" и вернуть управление вызывающему. Очень может быть что такое прерывание окажется некорректным или вообще не сработает, но это хотя бы позволит толкать либу в главной нитке без затей - уже легче
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Библиотека-убийца
«
Ответ #14 :
Апрель 13, 2014, 11:22 »
Цитата: Igors от Апрель 13, 2014, 11:14
Смысл "прерваться" и вернуть управление вызывающему. Очень может быть что такое прерывание окажется некорректным или вообще не сработает, но это хотя бы позволит толкать либу в главной нитке без затей - уже легче
Вот функция.
Она будет немного долго выполняться, запустите ее пожалуйста как хотите, что бы она через пять секунд вышла. Хотите с исключениями, хотите без.
Код
C++ (Qt)
void
func
(
)
{
for
(
;;
)
{
}
}
Записан
Страниц: [
1
]
2
3
4
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...