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

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

Страниц: 1 [2] 3 4   Вниз
  Печать  
Автор Тема: Библиотека-убийца  (Прочитано 22138 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Вот функция.
Она будет немного долго выполняться, запустите ее пожалуйста как хотите, что бы она через пять секунд вышла. Хотите с исключениями, хотите без.
В том-то и дело что выйдет если удастся передать в эту нитку исключение. Как это сделать - не знаю. Вроде в WinAPI такая возможность есть, но это не моя основная платформа. А в букваре Qt 5 пишут что передавать можно - вот это интересно было бы проверить.
Записан
Bepec
Гость
« Ответ #16 : Апрель 13, 2014, 12:03 »

Сами напросились. Вот примерчик https://dl.dropboxusercontent.com/u/101053289/Program/testFuncThreadStopForced.zip.

Щелчок - запуск ф-ции/остановка ф-ции.

Потоки внутри выглядят вот так
Код:
	void run()
{
for(long i = 0; ; i++)
{
// не даёт заспамить сигналами всё вокруг
if (i == 100000000)
{
state_ = !state_;
emit state(state_);
i = 0;
}

}
}
Вроде все условия выполнены. Остановка неизвестной ф-ции через неопределённое количество времени Улыбающийся

Потоков всего 5, ибо пустые и грузят проц под 99 Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



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

Вроде в WinAPI такая возможность есть, но это не моя основная платформа.
Бросить C++ исключение через WinAPI? Вряд ли. Улыбающийся
Если имеется ввиду SEH, то это не исключения C++.

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

Сообщений: 4349



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

Сами напросились.
А что это? Улыбающийся
Записан
Bepec
Гость
« Ответ #19 : Апрель 13, 2014, 14:26 »

Это функция в потоке, которую ты же и просил Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



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

Это функция в потоке, которую ты же и просил Улыбающийся
Есть функция func, она спрятана в библиотеке. Ее нужно прервать через 5 секунд.
А это я не знаю что. Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

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

Это функция в потоке, которую ты же и просил Улыбающийся
Непонимающий Не врубился, о чем Вы?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



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

Не она шлет, а ей пошлют (а она (ее  вызывающий) поймает). Вот это было бы хорошее дело. Но может все это мои фантазии - не проверял.
Нечем ей (от ее имени) послать исключение C++. Улыбающийся
Записан
Bepec
Гость
« Ответ #23 : Апрель 13, 2014, 14:45 »

Кхм.

Ладно, видимо выходной на вас влияет Веселый

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

То, что я её сразу запихал в поток, а не извлекал из dll - для простоты. В 100 из 100 случаев нормальная отработка.

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

Сообщений: 4349



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

То, что я её сразу запихал в поток, а не извлекал из dll для простоты. В 100 из 100 случаев нормальная отработка.
Запихайте пожалуйста, что бы я увидел, в каком месте она вызывается.
Вот прямо что бы так было написано. Улыбающийся
func();
Записан
Bepec
Гость
« Ответ #25 : Апрель 13, 2014, 14:51 »

А хохо не хуху? Веселый

Прямое написание будет равнозначно вызову функции.

Для прекращение работы зависшей функции нужна обертка.

Т.е. неизбежно будет saveFunction(&func, 6) допустим.
Если процедура унифицированная, то вполне возможно и просто создавать потоки на каждое выполнение функции.

PS собственно у вас и проблема, что сама функция не имеет этого механизма. В общем глупое заявление Веселый

PPS модифицируем пример и вуаля - у вас в обертке вызывается функция с защитой от зависания.
Код:
	void run()
{
          func();
}
« Последнее редактирование: Апрель 13, 2014, 14:53 от Bepec » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



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

Прямое написание будет равнозначно вызову функции.
Ну так нам ее и надо...

Для прекращение работы зависшей функции нужна обертка.
Прекрасно. Какая? Хочу посмотреть код. Улыбающийся

Т.е. неизбежно будет saveFunction(&func, 6) допустим.
Хорошо, вот что там в saveFunction мы и ждем... Улыбающийся

Если процедура унифицированная, то вполне возможно и просто создавать потоки на каждое выполнение функции.
Так вроде и пытаемся создавать. Только толку ноль. Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



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

PPS модифицируем пример и вуаля - у вас в обертке вызывается функция с защитой от зависания.
Прекрасно, где же это чудо обертка? Улыбающийся
Записан
Bepec
Гость
« Ответ #28 : Апрель 13, 2014, 14:56 »

Представьте в моем предыдущем сообщении прикреплена ссылка на архив с исходниками, Оо. Или вы её так небрежно не заметили? Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



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

Представьте в моем предыдущем сообщении прикреплена ссылка на архив с исходниками, Оо. Или вы её так небрежно не заметили? Улыбающийся
Скажите пожалуйста в каком месте вызывается функция func()?
Записан
Страниц: 1 [2] 3 4   Вверх
  Печать  
 
Перейти в:  


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