Russian Qt Forum
Ноябрь 24, 2024, 21:23 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3 4   Вниз
  Печать  
Автор Тема: Библиотека-убийца  (Прочитано 23133 раз)
OKTA
Гость
« : Апрель 11, 2014, 17:14 »

Товарищи, подскажите, как лучше поступить в следующей ситуации.
Подключаю через QLibrary библиотеку. Нахожу в ней адрес нужной мне функции, через которую все операции с этой библиотекой происходят и начинаю с ней работать. Структура библиотеки едина, но самих таких библиотек может быть несколько.
И иногда встречаются случаи, когда чьи-то кривые руки сделали эту библиотеку не по стандарту.. Вызываю функцию библиотеки, а она, собака, стопорит поток, не возвращая значение. Я знаю, что этого быть не должно и в этом случае надо прервать все работы с этой библиотекой. Каким образом лучше всего это сделать?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #1 : Апрель 11, 2014, 17:16 »

Параллельно с вызовом функции библиотеки запустить таймер (возможно в другом потоке), и если по истечении времени таймера выхода их функции нет, то сообщать об этом.
Записан
OKTA
Гость
« Ответ #2 : Апрель 11, 2014, 17:22 »

Таймер да, о нем я тоже подумал. Но он только даст сигнал, что "что-то не так с библиотекой". Вопрос в том, как можно ее безопасно выгрузить? Простой unload убьет всю программу целиком, т.к. к моменту, когда происходит это зависание, уже много чего инициализировано в памяти самой этой библиотекой (и к этим данным не достучаться) В замешательстве
Записан
kamre
Частый гость
***
Offline Offline

Сообщений: 233


Просмотр профиля
« Ответ #3 : Апрель 11, 2014, 19:13 »

в этом случае надо прервать все работы с этой библиотекой. Каким образом лучше всего это сделать?
В отдельном процессе запускать функции библиотеки, а если что, то прибивать процесс.
Записан
OKTA
Гость
« Ответ #4 : Апрель 11, 2014, 20:34 »

Это уже не просто функции библиотеки запускать в отдельном процессе, а приложение отдельное делать, которое будет работать с библиотеками  В замешательстве а это жесть, учитывая специфику этих библиотек.
Записан
Bepec
Гость
« Ответ #5 : Апрель 11, 2014, 21:54 »

Почему приложение? Говорите уж тогда специфику, тогда мб что придумаем Улыбающийся
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #6 : Апрель 11, 2014, 21:59 »

Почему приложение? Говорите уж тогда специфику, тогда мб что придумаем Улыбающийся

Просто интересно - а как функцию из библиотеки можно запустить в отдельном процессе без написания ещё одной программы-обёртки?
Записан
Bepec
Гость
« Ответ #7 : Апрель 12, 2014, 13:47 »

псевдокод.
Код:
::CreateThread(blabla, названиефункции).
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #8 : Апрель 12, 2014, 15:02 »

псевдокод.
Код:
::CreateThread(blabla, названиефункции).
Это запуск в отдельной нитке, того же процесса.
Записан
Bepec
Гость
« Ответ #9 : Апрель 12, 2014, 15:20 »

Виноват, невнимательно прочитал.

Довольно сложно, но можно. Идём в чужой процесс, залазим к нему в память, разворачиваем там свой лагерь и что угодно делаем. Но это для проблемы уже слишком масштабно. Ммм... да, видел где то инициацию форка эксплорера, правда для других задач, но в качестве расходного процесса пойдёт Улыбающийся

А если своя обертка, просто локальные сокеты и запуск отдельного процесса со связью.

PS у меня есть опыт в этой области, но она "на грани" разумного Веселый
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #10 : Апрель 13, 2014, 08:42 »

Это уже не просто функции библиотеки запускать в отдельном процессе, а приложение отдельное делать, которое будет работать с библиотеками  В замешательстве а это жесть, учитывая специфику этих библиотек.
К сожалению ничего умнее, чем делать отдельное приложение, которое будет грузить эти библиотеки и взаимодействовать через IPC с главным приложением выдумать не получится - не зря в Хроме для того, чтобы обесчестить независимость (в смысле стабильности) от плагинов каждая вкладка как отдельный процесс реализована.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Апрель 13, 2014, 09:37 »

Я знаю, что этого быть не должно и в этом случае надо прервать все работы с этой библиотекой. Каким образом лучше всего это сделать?
"вынести в процесс" - удовольствие дорогое. Интересно попробовать механизм передачи исключений между нитками. В Qt 5 что-то есть (не вникал)
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #12 : Апрель 13, 2014, 10:18 »

"вынести в процесс" - удовольствие дорогое.
Да.
Но процесс мы можем убить без последствия для других процессов, а вот нитку для процесса не всегда.

Интересно попробовать механизм передачи исключений между нитками. В Qt 5 что-то есть (не вникал)
А какой в этом смысл? Если бы функция из библиотеки могла сама определять, что она зависла, то ей не обязательно было бросать исключение, достаточно просто завершаться.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #13 : Апрель 13, 2014, 11:14 »

А какой в этом смысл? Если бы функция из библиотеки могла сама определять, что она зависла, то ей не обязательно было бросать исключение, достаточно просто завершаться.
Смысл "прерваться" и вернуть управление вызывающему. Очень может быть что такое прерывание окажется некорректным или вообще не сработает, но это хотя бы позволит толкать либу в главной нитке без затей - уже легче
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #14 : Апрель 13, 2014, 11:22 »

Смысл "прерваться" и вернуть управление вызывающему. Очень может быть что такое прерывание окажется некорректным или вообще не сработает, но это хотя бы позволит толкать либу в главной нитке без затей - уже легче

Вот функция.
Она будет немного долго выполняться, запустите ее пожалуйста как хотите, что бы она через пять секунд вышла. Хотите с исключениями, хотите без.
Код
C++ (Qt)
void func()
{
   for(;;)
   {
   }
}
 

Записан
Страниц: [1] 2 3 4   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.131 секунд. Запросов: 23.