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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: потоки  (Прочитано 9776 раз)
CPP11
Гость
« Ответ #15 : Декабрь 08, 2014, 20:05 »

Давайте без самодеятельности, аварийное завершение - себе дороже. Единственный способ завершить thread - дать ей нормально выйти. Никуда не денется - выйдет, не надо дергаться
Это ошибочный подход, лучше завершить/перезапустить зависшее приложение, чем оставлять его на самотёк. Это негативно сказывается на юзабилити и усложняет сбор сведений о сбоях для дальнейшего анализа.
Записан
Alexu007
Гость
« Ответ #16 : Декабрь 09, 2014, 00:29 »

Так вот, при 2 и более отправителях последовательность НЕ "именно та".
"кто успел тот и съел"
От решаемой задачи зависит. Почему бы в сообщения не вставить порядковые номера, а получатель пусть решает, как поступать с сообщениями - сразу обрабатывать или сбросить в буфер и пусть ждёт очереди? Но если будет много инфы в очереди - то может здесь вообще потоки лучше не использовать? Сложный алгоритм работы с очередью сообщений съест эффект быстродействия потоков.
Записан
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #17 : Декабрь 09, 2014, 00:57 »

От решаемой задачи зависит. Почему бы в сообщения не вставить порядковые номера, а получатель пусть решает, как поступать с сообщениями - сразу обрабатывать или сбросить в буфер и пусть ждёт очереди? Но если будет много инфы в очереди - то может здесь вообще потоки лучше не использовать? Сложный алгоритм работы с очередью сообщений съест эффект быстродействия потоков.
О каких сообщениях и очередях идет речь? CPP11 в начале говорил об механизме сигналов/слотов. Сигналы попадают в очередь сообщений Qt, и именно Qt распределяет их по потокам.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #18 : Декабрь 09, 2014, 14:45 »

Это ошибочный подход, лучше завершить/перезапустить зависшее приложение, чем оставлять его на самотёк. Это негативно сказывается на юзабилити и усложняет сбор сведений о сбоях для дальнейшего анализа.
А Вы можете подтвердить Ваши слова кодом? (хотя бы псевдокодом)
Код
C++ (Qt)
thread->quit();
if(thread->wait(1000))
{
delete worker;
delete thread;
}
else {
...  // и что здесь??
}
 
Записан
CPP11
Гость
« Ответ #19 : Декабрь 09, 2014, 18:27 »

Igors, это зависит от контекста. Часто нужно сохранить промежуточное состояние приложения и после перезапуска попытаться вернуть его в это состояние. Естественно нужно зафиксировать сам факт падения и информацию, которая может помочь выявить причину - обычно это дамп процесса(чаще минидамп + состояние объектов), если программа полагается на сторонние компоненты, то имеет смысл сохранить и информацию о них. После перезапуска приносим извинения пользователю и отправляем себе отчёт об ошибке (некоторые приложения просят пользователя подтвердить отправку, т.к. в таких дампах может содержаться приватная информация).
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #20 : Декабрь 09, 2014, 18:49 »

Igors, это зависит от контекста. Часто нужно сохранить промежуточное состояние ...
Ну и что Вы будете сохранять в данном случае? Откуда Вы возьмете промежуточное состояние - или вообще хоть какую-то информацию достойную сохранения/посылки? И почему такая ситуация вообще расценивается как "падение"? Нитка не завершилась через 1 секунду? Так что с того, такое вполне вполне возможно если напр было распределено гораздо больше памяти чем физически имеет хилая машина, или хороший файл мапнут в память (вындоуз пошла по свопам).

Так зачем врать самому себе надеясь что ну когда-то (в будущем) Вы напишете тонну кода для обработки этой ситуации? В лучшем случае это будет assert который потом уберут. Здесь нет конструктивного выбора, и это лучше признать сразу.
Записан
CPP11
Гость
« Ответ #21 : Декабрь 09, 2014, 19:41 »

Ну и что Вы будете сохранять в данном случае?
Да элементарно - тут нужно завершить приложение, так что просто убиваем свой процесс, а ОС всё подчистит. В противном случае получим зависшее окно, которое будет мозолить глаза пользователю, который его рано или поздно убьёт, вспоминая вас добрым словом. А если окна не будет, то процесс просто будет висеть и жрать ресурсы, пока система не перезагрузится, что ещё хуже.
Нитка не завершилась через 1 секунду?
не надо цепляться к этой цифре, можно выбрать свою в зависимости от ситуации, в моём случае подвисать там нечему, поэтому выбран период, который не позволит пользователю заетить подвисание. Возможно, 5 секунд будет лучшим выбором для Windows, чтобы дождаться повышения приоритета на случай загруженности процессора. Как бы то ни было, это оффтоп, вопрос был не о выборе времени ожидания завершения процесса.
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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