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

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

Страниц: [1] 2 3 4   Вниз
  Печать  
Автор Тема: QThread  (Прочитано 23336 раз)
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« : Май 22, 2012, 18:40 »

 Улыбающийся

Скажите. QThread::quit() удаляет объект потока Непонимающий

Спасибо.
Записан
Bepec
Гость
« Ответ #1 : Май 22, 2012, 19:09 »

Насколько я помню, это останавливает поток. Объект потока при этом остаётся.
Записан
V1KT0P
Гость
« Ответ #2 : Май 22, 2012, 19:12 »

Насколько я помню, это останавливает поток. Объект потока при этом остаётся.
Это останавливает цикл обработки событий.
Записан
iroln
Гость
« Ответ #3 : Май 22, 2012, 19:24 »

Улыбающийся

Скажите. QThread::quit() удаляет объект потока Непонимающий

Спасибо.
Если у вас в потоке не запускается цикл обработки событий, то эта функция вообще ничего не делает.
Записан
mutineer
Гость
« Ответ #4 : Май 22, 2012, 19:26 »

Улыбающийся

Скажите. QThread::quit() удаляет объект потока Непонимающий

Спасибо.

не удаляет
Записан
Даниил
Гость
« Ответ #5 : Май 22, 2012, 19:35 »

Вы прочли монолог коллективного разума prog.org.ru! Простите, не удержался  Смеющийся
Записан
Alex_C
Гость
« Ответ #6 : Май 22, 2012, 19:53 »

Нет не удаляет. Правильно удалить поток так (но только в том случае, если в потоке запускается ф-ция exec() - запуск обработки событий):

Код:
    if(thread) 
    {
        thread->quit(); // указываем, что потоку нужно завершиться
        thread->wait(); // ждем завершения
        delete thread; // Удаляем
        thread = 0; // чтоб первый if сработал
    }
Записан
iroln
Гость
« Ответ #7 : Май 22, 2012, 20:18 »

У меня вопрос в тему. Как лучше и правильнее.

Например у меня есть поток без цикла обработки событий, в нём запускается блокирующая длительная процедура, которая является "чёрным ящиком". В какой-то момент я хочу поток грохнуть, не дожидаясь, пока та процедура отработает. Наверное надо вызвать terminate? Но это вообще не рекомендуется, тогда вопрос, как быть?
« Последнее редактирование: Май 22, 2012, 20:19 от iroln » Записан
twp
Гость
« Ответ #8 : Май 22, 2012, 20:23 »

ну есть старый способ через флаг, который может быть установлен из другого потока и который проверяется в блокирующей процедуре. Если флаг установлен, то процедура прекращает вычисления и поток завершается корректно
Записан
iroln
Гость
« Ответ #9 : Май 22, 2012, 20:33 »

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

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Май 22, 2012, 20:40 »

ну есть старый способ через флаг, который ...
А может есть какой-то новый/лучший способ? Если знаете - расскажите, потому что мне кроме флага ничего не известно  Улыбающийся

Это если я сам ту блокирующую процедуру пишу. Естественно я так и делаю. Но тут не так просто, я не могу флаг поставить в ту блокирующую процедуру, у меня нет доступа в её код. По сути эту процедуру я дёргаю откуда-то из DLL. Типа, создаю некий объект и вызываю его метод calculate, который неизвестно как работает, мне от него нужен только результат вычислений.
Если управление ушло в эту ф-цию, то придется ждать когда вернется. Ф-ция должна иметь callback для таких целей, если его нет - то ничего не попишешь.
Записан
iroln
Гость
« Ответ #11 : Май 22, 2012, 20:46 »

Если управление ушло в эту ф-цию, то придется ждать когда вернется. Ф-ция должна иметь callback для таких целей, если его нет - то ничего не попишешь.
Да, приходится ждать. Потому что, если поток жёстко прервать, я боюсь, что в той функции может что-то произойти, что потащит за собой падение процесса, порчу данных, или что похуже.
Записан
Bepec
Гость
« Ответ #12 : Май 22, 2012, 20:52 »

Самый мой весёлый опыт - одновременный terminate 14 потоков, работающих с сторонней dll.

Результат - мышка отказала. Клавиатура реагировала где то на 4-5 нажатие, система после 5 минут раздумий выпала в бсод. 
Но это произошло после недели безостановочного пользования сей программой Подмигивающий т.е. 1 раз в неделю - помоему норм результат Веселый
Записан
V1KT0P
Гость
« Ответ #13 : Май 22, 2012, 21:05 »

Самый мой весёлый опыт - одновременный terminate 14 потоков, работающих с сторонней dll.

Результат - мышка отказала. Клавиатура реагировала где то на 4-5 нажатие, система после 5 минут раздумий выпала в бсод. 
Но это произошло после недели безостановочного пользования сей программой Подмигивающий т.е. 1 раз в неделю - помоему норм результат Веселый
Программа была запущена с админскими правами?
Записан
demaker
Птица говорун
*****
Offline Offline

Сообщений: 960


Просмотр профиля
« Ответ #14 : Май 22, 2012, 21:16 »

Понятно, как правильно удалять Улыбающийся

Тогда такой вопрос Улыбающийся
Допустим у меня есть оновной поток по нажатию клавиши  создается форма threadForm в  ней поток thread который изменяет счетчик по  timeout таймера. Если я нажимаю кнопку то таймер останавливается

thread->quit();
thread->wait();

а если делаю двойной клик мыши то запускается.

Не могу понять поток надо удалять или просто снова запускать в обработчики событий Непонимающий
Записан
Страниц: [1] 2 3 4   Вверх
  Печать  
 
Перейти в:  


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