![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
AD |
![]()
Сообщение
#1
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
Не понимаю, почему нет паузы в выполнении. Делаю так:
В чем недочеты? Почему не удается приостановить выполнение функции run()? |
|
|
![]() |
BRE |
![]()
Сообщение
#2
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
Не понимаю, почему нет паузы в выполнении. Делаю так: В чем недочеты? Почему не удается приостановить выполнение функции run()? Потому, что QThread::wait ждет момента завершения нити или наступления таймаута и выходит. Она нить не приостанавливает! Сообщение отредактировал BRE - 4.6.2009, 17:35 |
|
|
AD |
![]()
Сообщение
#3
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
Тогда вопрос: как заставить его таймаутиться?
Даже точнее: приостанавливать выполнение run(), а потом запускать run() с места остановки? Сообщение отредактировал AD - 4.6.2009, 17:39 |
|
|
BRE |
![]()
Сообщение
#4
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
Тогда вопрос: как заставить его таймаутиться? Даже точнее: приостанавливать выполнение run(), а потом запускать run() с места остановки? Циклы, флаги внутри run. Посмотри на prog.org, там обсуждалась подобная тема: http://www.prog.org.ru/topic_8910_0.html |
|
|
AD |
![]()
Сообщение
#5
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
Ну.... мне удалось сделать такую фишку!
![]() Вот таким образом:
|
|
|
igor_bogomolov |
![]()
Сообщение
#6
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
AD, мне всегда нравились твои краткие примеры
![]() То что ты cделал противоречит тобою же поставленной задачей. Цитата(AD) приостанавливать выполнение run(), а потом запускать run() с места остановки? То, что ты делаешь, это называется завершение потока Цитата if(terminated) return; А в дальнейшем, ты создаешь его заново Цитата vertical -> start(); т.е выполнение начнется с первой строки метода run.В строке quit убери, он тут ни к чему. Поток и так завершится. Если ты реально хочешь приостановиь поток, а потом продолжить с места остановки, используй QMutex совместно с QWaitCondition. Да и в принципе мьютексами пользоваться не стесняйся ![]() |
|
|
AD |
![]()
Сообщение
#7
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
Если ты реально хочешь приостановиь поток, а потом продолжить с места остановки, используй QMutex совместно с QWaitCondition. Да и в принципе мьютексами пользоваться не стесняйся ![]() Если бы знал, как корректно ими воспользоваться - обязательно бы это сделал! ![]() ![]() ![]() А вообще, да, я запускаю run с первой строчки, но: 1) у меня цикл начинается с места остановки; 2) условие, которое проверяется перед циклом, не выполняется, потому что прожектор и так, в крайнем верхнем положении! P.S. Подкорректировал код:
Сообщение отредактировал AD - 5.6.2009, 10:03 |
|
|
Litkevich Yuriy |
![]()
Сообщение
#8
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
AD, сворачивай код, слишком длинный
|
|
|
igor_bogomolov |
![]()
Сообщение
#9
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
2) условие, которое проверяется перед циклом, не выполняется, потому что прожектор и так, в крайнем верхнем положении! Ну тогда убери строку раз она не нужна. А то этот quit в конце потока, как то глаз немного режет. Не нужет он там. Да и вообще, использование quit внутри run, выглядит как то странно. 1) у меня цикл начинается с места остановки; Это другой вопрос. Что у тебя там происходит реально, разобраться даже и не пытался. Если все переменные сохраняются, и при новом запуске потока, все выглядит так, как будто ты продолжил с точки остонава, то можешь оставить и так. Это тоже вариант. Но только это не универсальное решение. Будешь решать другую задачу, опять сталкнешся с трудностями. Так что с мьютексами все равно надо разбираться. Тем более, что поток у тебя не безопасный. ИМХО.Если бы знал, как корректно ими воспользоваться - обязательно бы это сделал! Попробую небольшой тестовый пример накатать. ![]() |
|
|
AD |
![]()
Сообщение
#10
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
Ну тогда убери строку раз она не нужна. А то этот quit в конце потока, как то глаз немного режет. Не нужет он там. Да и вообще, использование quit внутри run, выглядит как то странно. Вот то что не пытался разобраться - это плохо! Я даже прокомментировал все действия. что выполняются в этих функциях! А убрать - не уберу, потому что это условие не выполняется, когда туда заходим после паузы, а при первом заходе, как правило, оно срабатывает. Так и должно быть! А вообще был очень удивлен, что я впринципе могу работать с одной структурой в двух разных потоках. Убедился, что это так - единственное, разные поля этой структуры обрабатываются разными потоками! |
|
|
igor_bogomolov |
![]()
Сообщение
#11
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
Вот то что не пытался разобраться - это плохо! Я даже прокомментировал все действия. что выполняются в этих функциях! Да какая мне разница куда у тебя там прожектор крутится, или что такое VALFROMBYTES. Я смотрю на структуру программы, и на поставленный тобою вопрос. Решение поставленной тобой задачи, на мой взглад не правильное. В каком направлении двигаться, тебе сказали. А делать такие заявления, как минимум не уважение. Разбирайся тогда сам, мне мое время тоже дорого.А убрать - не уберу, потому что это условие не выполняется, когда туда заходим после паузы, а при первом заходе, как правило, оно срабатывает. Да черт с ним с условием. quit там зачем поставил. Он вообще не нужен если нет цикла обработки событий. Ты хоть в асистент загляни.Цитата Tells the thread's event loop to exit with return code 0 (success). Equivalent to calling QThread::exit(0).
This function does nothing if the thread does not have an event loop. |
|
|
AD |
![]()
Сообщение
#12
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: ![]() ![]() ![]() |
Хорошо, quit() убрал.
А делать такие заявления, как минимум не уважение. Разбирайся тогда сам, мне мое время тоже дорого. Прости, вот обижать я не хотел. Просто некоторые вещи для анализа кода в целом можно и опустить, на мой взгляд. Если что, не сердись - неспециально! Прости! Указанная функция из двух байт (параметры) собирает одно числа типа int! |
|
|
igor_bogomolov |
![]()
Сообщение
#13
|
Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: ![]() ![]() ![]() |
Вот простенький пример, как приостановить поток при помощи QMutex & QWaitCondition.
mythread.h
mythread.cpp
main.cpp
.pro
Прикрепленные файлы
|
|
|
flankerr |
![]()
Сообщение
#14
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: ![]() ![]() ![]() |
просто, но зато ресуры проца буду юзаться... Сообщение отредактировал flankerr - 8.6.2009, 13:26 |
|
|
BRE |
![]()
Сообщение
#15
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
просто но зато ресуры проца буду юзаться... А зачем загружать процессор глупыми вычислениями времени? Если уж нити нужна пауза, лучше что-бы она в это время вообще ресурсы процессора не ела и он занялся чем-то более нужным. ![]() Сообщение отредактировал BRE - 8.6.2009, 13:26 |
|
|
flankerr |
![]()
Сообщение
#16
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: ![]() ![]() ![]() |
иногда,в тех случаях когда пауза небольшая и загрузка потка не особа критична, проще и выгодней написать три строчки кода чем городить целый огород.
|
|
|
BRE |
![]()
Сообщение
#17
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
иногда,в тех случаях когда пауза небольшая и загрузка потка не особа критична, проще и выгодней написать три строчки кода чем городить целый огород. IMHO, не очень хорошее отношение к коду. Да, для тебя, как для разработчика, так сделать проще . А вот если в каждой программе запущенной на компе, разработчики сделают по одному-паре таких потоков, и эти программы будут крутиться одновременно, то производительность может упасть очень сильно. ![]() |
|
|
Litkevich Yuriy |
![]()
Сообщение
#18
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
тему разделил, см. sleep в main'е
Всё таки от приостановки отдельного потока сильно отличается. |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 15.7.2025, 10:56 |