Приостановка потока |
Здравствуйте, гость ( Вход | Регистрация )
Приостановка потока |
AD |
4.6.2009, 16:49
Сообщение
#1
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
Не понимаю, почему нет паузы в выполнении. Делаю так:
В чем недочеты? Почему не удается приостановить выполнение функции run()? |
|
|
BRE |
4.6.2009, 17:35
Сообщение
#2
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
Не понимаю, почему нет паузы в выполнении. Делаю так: В чем недочеты? Почему не удается приостановить выполнение функции run()? Потому, что QThread::wait ждет момента завершения нити или наступления таймаута и выходит. Она нить не приостанавливает! Сообщение отредактировал BRE - 4.6.2009, 17:35 |
|
|
AD |
4.6.2009, 17:37
Сообщение
#3
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
Тогда вопрос: как заставить его таймаутиться?
Даже точнее: приостанавливать выполнение run(), а потом запускать run() с места остановки? Сообщение отредактировал AD - 4.6.2009, 17:39 |
|
|
BRE |
4.6.2009, 18:02
Сообщение
#4
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
Тогда вопрос: как заставить его таймаутиться? Даже точнее: приостанавливать выполнение run(), а потом запускать run() с места остановки? Циклы, флаги внутри run. Посмотри на prog.org, там обсуждалась подобная тема: http://www.prog.org.ru/topic_8910_0.html |
|
|
AD |
4.6.2009, 19:06
Сообщение
#5
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
Ну.... мне удалось сделать такую фишку!
Вот таким образом:
|
|
|
igor_bogomolov |
5.6.2009, 0:52
Сообщение
#6
|
Профессионал Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: 29 |
AD, мне всегда нравились твои краткие примеры
То что ты cделал противоречит тобою же поставленной задачей. Цитата(AD) приостанавливать выполнение run(), а потом запускать run() с места остановки? То, что ты делаешь, это называется завершение потока Цитата if(terminated) return; А в дальнейшем, ты создаешь его заново Цитата vertical -> start(); т.е выполнение начнется с первой строки метода run.В строке quit убери, он тут ни к чему. Поток и так завершится. Если ты реально хочешь приостановиь поток, а потом продолжить с места остановки, используй QMutex совместно с QWaitCondition. Да и в принципе мьютексами пользоваться не стесняйся |
|
|
AD |
5.6.2009, 10:03
Сообщение
#7
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
Если ты реально хочешь приостановиь поток, а потом продолжить с места остановки, используй QMutex совместно с QWaitCondition. Да и в принципе мьютексами пользоваться не стесняйся Если бы знал, как корректно ими воспользоваться - обязательно бы это сделал! Подскажешь, буду благодарен! А вообще, да, я запускаю run с первой строчки, но: 1) у меня цикл начинается с места остановки; 2) условие, которое проверяется перед циклом, не выполняется, потому что прожектор и так, в крайнем верхнем положении! P.S. Подкорректировал код:
Сообщение отредактировал AD - 5.6.2009, 10:03 |
|
|
Litkevich Yuriy |
5.6.2009, 10:06
Сообщение
#8
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
AD, сворачивай код, слишком длинный
|
|
|
igor_bogomolov |
5.6.2009, 10:24
Сообщение
#9
|
Профессионал Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: 29 |
2) условие, которое проверяется перед циклом, не выполняется, потому что прожектор и так, в крайнем верхнем положении! Ну тогда убери строку раз она не нужна. А то этот quit в конце потока, как то глаз немного режет. Не нужет он там. Да и вообще, использование quit внутри run, выглядит как то странно. 1) у меня цикл начинается с места остановки; Это другой вопрос. Что у тебя там происходит реально, разобраться даже и не пытался. Если все переменные сохраняются, и при новом запуске потока, все выглядит так, как будто ты продолжил с точки остонава, то можешь оставить и так. Это тоже вариант. Но только это не универсальное решение. Будешь решать другую задачу, опять сталкнешся с трудностями. Так что с мьютексами все равно надо разбираться. Тем более, что поток у тебя не безопасный. ИМХО.Если бы знал, как корректно ими воспользоваться - обязательно бы это сделал! Попробую небольшой тестовый пример накатать.
|
|
|
AD |
5.6.2009, 10:29
Сообщение
#10
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
Ну тогда убери строку раз она не нужна. А то этот quit в конце потока, как то глаз немного режет. Не нужет он там. Да и вообще, использование quit внутри run, выглядит как то странно. Вот то что не пытался разобраться - это плохо! Я даже прокомментировал все действия. что выполняются в этих функциях! А убрать - не уберу, потому что это условие не выполняется, когда туда заходим после паузы, а при первом заходе, как правило, оно срабатывает. Так и должно быть! А вообще был очень удивлен, что я впринципе могу работать с одной структурой в двух разных потоках. Убедился, что это так - единственное, разные поля этой структуры обрабатываются разными потоками! |
|
|
Текстовая версия | Сейчас: 3.1.2025, 7:16 |