crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> QThread - quit(), Не выходит из цикла
AD
  опции профиля:
сообщение 23.10.2009, 16:22
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Проблема следующая. Есть модальное диалоговое окошко, в котором рисуется какой-то график. При открытии окошка запускается параллельный поток, который заполняет необходимый вектор координат графика и постепенно отрисовывается. В функции run() вызывается функция в которой имеется цикл заполнения вектора. Если человек вдруг надоело ждать или он передумал смотреть этот график или ошибся (короче, по любой какой-то причине решил прервать отрисовку) и закрывается окно. При закрытии я вызываю функцию quit()! НО: после выполнения quit() в отладчике вижу, что мы снова попадаем в функцию c циклом. Что необходимо сделать, чтобы этот цикл сразу завершался? Если я после quit() пытаюсь вызвать wait(), то программа конкретно зависает.

Сообщение отредактировал AD - 23.10.2009, 16:22
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 23.10.2009, 16:57
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Цитата(AD @ 23.10.2009, 17:22) *
В функции run() вызывается функция в которой имеется цикл заполнения вектора.


Если ты не вызываешь exec() в run(), чтобы запустить цикл событий и используешь нечто вроде forever() или for(;;), то выхода не будет.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 23.10.2009, 22:54
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(SABROG @ 23.10.2009, 17:57) *
Цитата(AD @ 23.10.2009, 17:22) *
В функции run() вызывается функция в которой имеется цикл заполнения вектора.


Если ты не вызываешь exec() в run(), чтобы запустить цикл событий и используешь нечто вроде forever() или for(;;), то выхода не будет.

Цикл, конечно же конечный, но хотелось бы, чтобы он прекращался, как только окно закрывали....
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 23.10.2009, 22:59
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(AD @ 23.10.2009, 23:54) *
Цикл, конечно же конечный, но хотелось бы, чтобы он прекращался, как только окно закрывали....

Так введи в цикл еще одно условие для преждевременного выхода.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 23.10.2009, 23:00
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Как я понял за всё время существования потоков ничего кроме жестокого убийства потока и if (terminatedFlag) ничего не придумали?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 24.10.2009, 12:43
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(SABROG)
Как я понял за всё время существования потоков ничего кроме жестокого убийства потока и if (terminatedFlag) ничего не придумали?

Да, блин! :(
Цитата
Так введи в цикл еще одно условие для преждевременного выхода.

До этого додумался, но такое решение не нравится. :(
Жаль, что в Qt это не введено еще.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 24.10.2009, 15:50
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(AD @ 24.10.2009, 13:43) *
Жаль, что в Qt это не введено еще.

А что можно ввести? ;)
QEventLoop::exit (quit) и соответственно QThread::quit используют такой же подход со специальной переменной, при изменении которой цикл заканчивается.
В своих циклах нужно использовать свои переменные.

А почему это решение не нравиться?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Cergey
  опции профиля:
сообщение 24.10.2009, 16:24
Сообщение #8


Студент
*

Группа: Участник
Сообщений: 62
Регистрация: 18.10.2008
Пользователь №: 395

Спасибо сказали: 3 раз(а)




Репутация:   1  


Всегда, если подумать, можно установить условие для выхода!!!

Создавал потоки и так и не понял зачем нужен exec() ( причем тут for ) и что такое event loop!!!
Объяесните кто может??? ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 24.10.2009, 17:09
Сообщение #9


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(BRE @ 24.10.2009, 16:50) *
А что можно ввести? ;)
QEventLoop::exit (quit) и соответственно QThread::quit используют такой же подход со специальной переменной, при изменении которой цикл заканчивается.
В своих циклах нужно использовать свои переменные.

А почему это решение не нравиться?

Стоп.... Не пойму о каком еще цикле, который заканчивается, идет речь? Если нет своего цикла, то вообще в функцию run() задет раз и выйдет, все... О каком цикле идет речь, который заканчивается с помощью quit()? Да кстати, exec() никакие циклы не запускает - проверял!

Цитата(BRE @ 24.10.2009, 16:50) *
А почему это решение не нравиться?

Да почему, нормальное решение. Но уж очень какое-то искусственное!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 24.10.2009, 17:17
Сообщение #10


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(AD @ 24.10.2009, 18:09) *
Да кстати, exec() никакие циклы не запускает - проверял!

Ты ошибаешься.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 27.9.2020, 20:18