Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как правильно останавливать поток? 
:(
    Опции темы
daemonaz
Дата 31.1.2013, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 160
Регистрация: 4.5.2008

Репутация: нет
Всего: нет



Требуется поток с возможностью его  экстренного заверщения с последующим удалением объекта-потока из памяти. Если поток не трогать, то завершается благополучно, и сам себя удаляет по его завершении слотом deleteLater(). Для экстренного завершения потока использую terminate() и wait(), однако при таком подходе поток зависает надолго, помогает только закрытие приложения, предполагаю что удаление происходит раньше чем будет висеть в wait(), как мне побороть это?

в конструкторе  
Код

connect(this, SIGNAL(finished()), SLOT(deleteLater()));



завершение работы потока 

Код

void Thread::stop()
{
      terminate();
      wait();     
} 


можно конечно булеву переменную использовать для завершения, но думаю что это несерьезно

PM MAIL   Вверх
baldina
Дата 31.1.2013, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: нет
Всего: 101



Цитата(daemonaz @  31.1.2013,  09:07 Найти цитируемый пост)
можно конечно булеву переменную использовать для завершения, но думаю что это несерьезно

серьёзно именно так.
поток по сути своей функция, которая выполняет длительную работу или висит в цикле. досрочно завершить её можно установкой флага, проверяемого на каждом шаге цикла или в процессе работы
PM MAIL   Вверх
daemonaz
Дата 31.1.2013, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 160
Регистрация: 4.5.2008

Репутация: нет
Всего: нет



мне бы для начала понять почему не срабатывает парочка
Код

    terminate();
    wait(); 

там и зависает..



Это сообщение отредактировал(а) daemonaz - 31.1.2013, 09:36
PM MAIL   Вверх
bsa
Дата 1.2.2013, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



Цитата
void QThread::terminate () [slot]

Terminates the execution of the thread. The thread may or may not be terminated immediately, depending on the operating systems scheduling policies. Use QThread::wait() after terminate() for synchronous termination.

When the thread is terminated, all threads waiting for the thread to finish will be woken up.

Warning: This function is dangerous and its use is discouraged. The thread can be terminated at any point in its code path. Threads can be terminated while modifying data. There is no chance for the thread to clean up after itself, unlock any held mutexes, etc. In short, use this function only if absolutely necessary.

Termination can be explicitly enabled or disabled by calling QThread::setTerminationEnabled(). Calling this function while termination is disabled results in the termination being deferred, until termination is re-enabled. See the documentation of QThread::setTerminationEnabled() for more information.


Добавлено через 3 минуты и 35 секунд
Цитата(daemonaz @  31.1.2013,  10:30 Найти цитируемый пост)
там и зависает..

варианты, перед вызовом stop() ты захватил мьютекс. Поток перед вызовом стоп тоже встал на этот мьютекс. После terminate() идет wait(), который ждет завершения потока, который висит на мьютексе. Или другой вариант - поток завис до этого на системном вызове...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0823 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.