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

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

Страниц: 1 2 [3] 4   Вниз
  Печать  
Автор Тема: Библиотека-убийца  (Прочитано 22144 раз)
Bepec
Гость
« Ответ #30 : Апрель 13, 2014, 15:02 »

я её развернул в бесконечный цикл с отправкой сигнала. В классе fiber, в методе run().
Собственно это подходит для унифицированной функции. fiber - обертка, в run - унифицированный запуск функции.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



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

я её развернул в бесконечный цикл с отправкой сигнала. В классе fiber, в методе run().
Как вы представляете разворот уже собранной функции из dll в fiber?


Собственно это подходит для унифицированной функции. fiber - обертка, в run - унифицированный запуск функции.
Если бы был доступ к коду, такие чудеса не понадобились бы. Улыбающийся
Записан
Bepec
Гость
« Ответ #32 : Апрель 13, 2014, 15:07 »

Выходной. Неужели разум на отдыхе?
Варианты:
1)  достаём непосредственно в обертке.
Код:
void run()
{
QLibrary libr("blabla");
/*Тут туфта с доставанием функции, её прототипом*/
func();
}


2) передаём в конструкторе обертки
Код:
fiber::fiber(Указатель на функцию func);
...
void run
{
func();
}

3) глобальный объект
Код:
void run
{
 SingleToneDllPointer.func();
}

Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



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

Выходной. Неужели разум на отдыхе?
Да вот я смотрю что на отдыхе. Улыбающийся

Код
C++ (Qt)
void run()
{
QLibrary libr("blabla");
/*Тут туфта с доставанием функции, её прототипом*/
func();    // все мы зависли, только убийство нитки нам поможет
}
 

Код
C++ (Qt)
fiber::fiber(Указатель на функцию func);
...
void run
{
func();    // все мы зависли, только убийство нитки нам поможет
}
 

Код
C++ (Qt)
void run
{
SingleToneDllPointer.func();     // все мы зависли, только убийство нитки нам поможет
}
 

А нам нужно определить, что произошел зависон, прервать выполнение этой функции и, думаю, запустить функцию из другой библиотеке.
Записан
Bepec
Гость
« Ответ #34 : Апрель 13, 2014, 15:25 »

Ёмой, ты на меня ещё повесь чтоб она и в сортир сходила и смысла за собой.

Прочитай внимательно свою же реплику, в ответ на которую я сделал сей пример... Прочитай.
Цитировать
Вот функция.
Она будет немного долго выполняться, запустите ее пожалуйста как хотите, что бы она через пять секунд вышла. Хотите с исключениями, хотите без.


Я привел тебе набросок, который позволяет остановить любую функцию в любой момент.

Что тебе надо дальше?! Набросок не равняется рабочий и подходящий для вас компонент, но он есть и работает. Узнать почему зависла - невозможно, ибо dll для нас чёрный ящик.

Ещё у данной dll скорее всего интерфейс не ограничивается 1 функцией. Есть и вывод ошибок, некорректных данных и прочего.

В результате:
1) имеется функционал остановки функции в любой момент.
2) у вас имеется описание функции.
3) у вас ещё какие то запросы.

Куда и что вы добавите ваше дело.
« Последнее редактирование: Апрель 13, 2014, 15:27 от Bepec » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



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

Я привел тебе набросок, который позволяет остановить любую функцию в любой момент.
Не привел. Вы что то где то размазали и куда то что вставили.

Код
C++ (Qt)
void func()
{
   qDebug() << "Running...";
   for(;;)
   {
   }
}
 

Вот функция, менять ее нельзя. Ее нужно вызвать и прервать через 5 секунд. Именно ее.
Записан
Bepec
Гость
« Ответ #36 : Апрель 13, 2014, 15:30 »

Йепте, вот опиши её где угодно и вставь её вызов в run. Это ТАК сложно?

Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



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

Йепте, вот опиши её где угодно и вставь её вызов в run. Это ТАК сложно?
Для меня да. Покажите в реальном примере.
Записан
Bepec
Гость
« Ответ #38 : Апрель 13, 2014, 15:31 »

Код:

void func()
{
    qDebug() << "Running...";
    for(;;)
    {
    }
}

class fiber
{
// тут остальные методы и код
void fiber::run()
{
func();
}
}

Где проблема? Почему вызов функции у вас вызывает какие-то проблемы невнятные?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



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

Код:

void func()
{
    qDebug() << "Running...";
    for(;;)
    {
    }
}

class fiber{
void fiber::run()
{
func(); }
}
}
Здесь нельзя остановить нитку fiber без terminate. Улыбающийся
Записан
Bepec
Гость
« Ответ #40 : Апрель 13, 2014, 15:34 »

Йепте, так в том и дело, что мы используем .... Тараааммм - terminate!
Потому что:
1) Прервать выполнение функции нельзя.
2) Можно terminate потока.
3) Можно убить процесс.

Вариантов больше нет, если не изменять тело функции Веселый

И да, существенный недостаток вашего сообщения - нигде вы не говорите, что terminate нельзя Улыбающийся

PS ещё имеется функционал, о котором писал Igors - передача исключения. Я пытался использовать его из-за похожей проблемы, но не получилось чегой то.
« Последнее редактирование: Апрель 13, 2014, 15:37 от Bepec » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



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

2) Можно terminate потока.
Не можно. Частенько это будет приводить к порче основного процесса.
Мы тут все это придумываем с процессами-песочницами, только поэтому. Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



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

И да, существенный недостаток вашего сообщения - нигде вы не говорите, что terminate нельзя Улыбающийся
Вы правда думали, что кроме вас про terminate никто не слыхал. Улыбающийся

Кстати, чуть выше задачки я писал:
Но процесс мы можем убить без последствия для других процессов, а вот нитку для процесса не всегда.
« Последнее редактирование: Апрель 13, 2014, 15:40 от Old » Записан
Bepec
Гость
« Ответ #43 : Апрель 13, 2014, 15:40 »

Не приводит это к порче процесса. Terminate заставляет поток умереть, но не сразу.
Т.е. могут быть попорчены используемые и передаваемые в функцию переменные. Так же может быть попорчено выделение памяти.

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

PS ей богу, вы своё сообщение не прочитали. Ни разу наверно Веселый Вы не ограничивая никого в средствах бросили вызов. Вызов принят, результат есть, а вы находите уже какие то непонятки аля
Цитировать
"Как вы представляете разворот уже собранной функции из dll в fiber?"
или  
Цитировать
"А нам нужно определить, что произошел зависон, прервать выполнение этой функции и, думаю, запустить функцию из другой библиотеке."
или  же вот этот милый диалог.
Old:
Цитировать
Цитировать
PPS модифицируем пример и вуаля - у вас в обертке вызывается функция с защитой от зависания.
Прекрасно, где же это чудо обертка? Улыбающийся
Я:
Цитировать
Представьте в моем предыдущем сообщении прикреплена ссылка на архив с исходниками, Оо. Или вы её так небрежно не заметили?
ИИИИ... Добивание Old:
Цитировать
Скажите пожалуйста в каком месте вызывается функция func()?
Какая функция? Написано ж про модификацию примера Веселый

Требуете того, о чем не написали. Сообщения к тому ж не читаете видимо Улыбающийся
« Последнее редактирование: Апрель 13, 2014, 15:46 от Bepec » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



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

Не приводит это к порче процесса. Terminate заставляет поток умереть, но не сразу.
http://msdn.microsoft.com/en-us/library/windows/desktop/ms686724%28v=vs.85%29.aspx

Цитировать
The TerminateThread and TerminateProcess functions should be used only in extreme circumstances, since they do not allow threads to clean up, do not notify attached DLLs, and do not free the initial stack. In addition, handles to objects owned by the thread are not closed until the process terminates. The following steps provide a better solution:
Записан
Страниц: 1 2 [3] 4   Вверх
  Печать  
 
Перейти в:  


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