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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Не убивается поток Qt3.3.8 VC2005  (Прочитано 14062 раз)
Примерный ученик
Бывалый
*****
Offline Offline

Сообщений: 450


И это не всегда помогает


Просмотр профиля
« : Декабрь 19, 2010, 15:24 »

В потоке идут сложные вычисления, которые могут цыклить.
Если поток долго не заканчивается, то его нужно убить.
Решение принимает оператор.
При попытке убить
 
Код:
terminate()
в отладчике получаю сообщение
Код:
Non-recursive mutex already locked by this thread

Как его все таки убить?
Записан

Как мало времени и как много нужно узнать
Fat-Zer
Гость
« Ответ #1 : Декабрь 19, 2010, 17:16 »

В документации пишут, что terminate()'ом пользоваться не надо:
Цитировать
Warning: This function is dangerous and its use is discouraged. The thread can be terminate at any point in its code path. Threads can be terminated while modifying data. There is no chance for the thread to cleanup after itself, unlock any held mutexes, etc. In short, use this function only if absolutely necessary.

Предложение: заводите булевскую переменную и при необходимате останова ставите её в тру, в цикле проверяете значение.

ЗЫ: это по опыту работы c qt4, с 3-им не работал
Записан
Примерный ученик
Бывалый
*****
Offline Offline

Сообщений: 450


И это не всегда помогает


Просмотр профиля
« Ответ #2 : Декабрь 19, 2010, 17:24 »

Нет там цикла. Однократный вызов функции, написанной сторонним разработчиком.
Если данные не корректны, то функция может вычислять до конца веков...
Проверить данные заранее нет возможности... Непонимающий
Записан

Как мало времени и как много нужно узнать
Fat-Zer
Гость
« Ответ #3 : Декабрь 19, 2010, 17:56 »

ругань идёт на QMutex, а если его просто объявить объявить рекурсивным?
Записан
Примерный ученик
Бывалый
*****
Offline Offline

Сообщений: 450


И это не всегда помогает


Просмотр профиля
« Ответ #4 : Декабрь 19, 2010, 17:59 »

Поскольку вычисление однократное, я мютекс вообще не использовал Непонимающий
Записан

Как мало времени и как много нужно узнать
Fat-Zer
Гость
« Ответ #5 : Декабрь 19, 2010, 18:05 »

А можно код связанный с потоком?
Записан
Примерный ученик
Бывалый
*****
Offline Offline

Сообщений: 450


И это не всегда помогает


Просмотр профиля
« Ответ #6 : Декабрь 19, 2010, 18:47 »

тело исполнения

Код:
void parVF::run()
{
               double obr=0.0, vit=0.0,tz=0.0,kz=0;
calc( &obr, &tz, &vit, &kz);
if ( kz == 0 )
{
T = obr;
H = tz;
L =vit;
}
}
// выдача результата расчета
QApplication::postEvent( rc, new THL_Message(T,H,L) );
}
Записан

Как мало времени и как много нужно узнать
Примерный ученик
Бывалый
*****
Offline Offline

Сообщений: 450


И это не всегда помогает


Просмотр профиля
« Ответ #7 : Декабрь 20, 2010, 11:03 »

Неужели нельзя убить процесс???
 Непонимающий
Записан

Как мало времени и как много нужно узнать
Fat-Zer
Гость
« Ответ #8 : Декабрь 20, 2010, 11:48 »

в коде вроде ничего криминального...
ещё из документации:
Цитировать
This function terminates the execution of the thread. The thread may or may not be terminated immediately, depending on the operating system's scheduling policies. Use QThread::wait() after terminate() for synchronous termination.

Ещё на всякий случай выложите запуск, останов и объявление потока
« Последнее редактирование: Декабрь 20, 2010, 11:52 от Fat-Zer » Записан
Примерный ученик
Бывалый
*****
Offline Offline

Сообщений: 450


И это не всегда помогает


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

Код:
		parVF = new parV(this,F0);
if (parVF)
{
parVF->start();
                }

Код:
	if (parVF)
{
parVF->terminate();
if (parVF->finished())
{
delete (parVF);
parVF=0;
}
}

Предполагается многократное использование расчета.
Записан

Как мало времени и как много нужно узнать
Fat-Zer
Гость
« Ответ #10 : Декабрь 20, 2010, 14:02 »

Вроде тоже ничего страшного.
А как в документации посоветовали:
Код:
parVF->terminate();
parVF->wait();
Не помогает?
Записан
Примерный ученик
Бывалый
*****
Offline Offline

Сообщений: 450


И это не всегда помогает


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

пробовал...
Не помогает...
Висит зараза и все тут Непонимающий
поток этот грузит процессор на 99%.
Может еще попробовать узнавать ID потока и убивать системными средствами?
Но как то коряво будет Строит глазки
Записан

Как мало времени и как много нужно узнать
Fat-Zer
Гость
« Ответ #12 : Декабрь 20, 2010, 14:26 »

Висит зараза и все тут Непонимающий
поток этот грузит процессор на 99%.
Это ожидаемо было...
а если вместо реальных вычислений заглушку впихнуть, while(1);?
Записан
Примерный ученик
Бывалый
*****
Offline Offline

Сообщений: 450


И это не всегда помогает


Просмотр профиля
« Ответ #13 : Декабрь 20, 2010, 14:59 »

Эффект тот же
Код:
Non-recursive mutex already locked by this thread
Записан

Как мало времени и как много нужно узнать
Fat-Zer
Гость
« Ответ #14 : Декабрь 20, 2010, 16:14 »

теряюсь в догадках, что делать... видимо во время бесперерывного выполнения нельзя убить...
Код:
while(1) usleуp(1);
При такой заглушке завершение должно пройти нормально...
В 4.4 появилась вкусная штука QFuture, её можно было бы попробовать... что с 3-им делать - хз
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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