QThread - quit(), Не выходит из цикла |
Здравствуйте, гость ( Вход | Регистрация )
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, 22:54
Сообщение
#3
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
В функции run() вызывается функция в которой имеется цикл заполнения вектора. Если ты не вызываешь exec() в run(), чтобы запустить цикл событий и используешь нечто вроде forever() или for(;;), то выхода не будет. Цикл, конечно же конечный, но хотелось бы, чтобы он прекращался, как только окно закрывали.... |
|
|
BRE |
23.10.2009, 22:59
Сообщение
#4
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
|
|
|
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 |
Жаль, что в 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 |
А что можно ввести? QEventLoop::exit (quit) и соответственно QThread::quit используют такой же подход со специальной переменной, при изменении которой цикл заканчивается. В своих циклах нужно использовать свои переменные. А почему это решение не нравиться? Стоп.... Не пойму о каком еще цикле, который заканчивается, идет речь? Если нет своего цикла, то вообще в функцию run() задет раз и выйдет, все... О каком цикле идет речь, который заканчивается с помощью quit()? Да кстати, exec() никакие циклы не запускает - проверял! А почему это решение не нравиться? Да почему, нормальное решение. Но уж очень какое-то искусственное! |
|
|
BRE |
24.10.2009, 17:17
Сообщение
#10
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
|
|
|
Текстовая версия | Сейчас: 30.12.2024, 19:04 |