![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
Ov3r1oad |
![]()
Сообщение
#1
|
Студент ![]() Группа: Участник Сообщений: 19 Регистрация: 21.12.2011 Пользователь №: 3085 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Есть объект QTimer, связан со слотом, но почему-то после start в этот слот не заходит, хотя время идёт. В чем может быть проблема?
ну а потом в функции func я вызываю start. Не заходит в update. |
|
|
![]() |
Алексей1153 |
![]()
Сообщение
#2
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
1) где и как создаёшь объект QTimer?
2) где соединяешь сигнал и слот ? 3) где вызываешь start ? 4) как определяешь, что "время идёт"? Сообщение отредактировал Алексей1153 - 24.2.2012, 17:16 |
|
|
maint |
![]()
Сообщение
#3
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 235 Регистрация: 3.8.2009 Из: Иркутск Пользователь №: 982 Спасибо сказали: 28 раз(а) Репутация: ![]() ![]() ![]() |
Есть объект QTimer, связан со слотом, но почему-то после start в этот слот не заходит, хотя время идёт. В чем может быть проблема?
ну а потом в функции func я вызываю start. Не заходит в update. а вызов показать ? Сообщение отредактировал maint - 24.2.2012, 17:16 |
|
|
Ov3r1oad |
![]()
Сообщение
#4
|
Студент ![]() Группа: Участник Сообщений: 19 Регистрация: 21.12.2011 Пользователь №: 3085 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Алексей1153 |
![]()
Сообщение
#5
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
![]() |
|
|
Ov3r1oad |
![]()
Сообщение
#6
|
Студент ![]() Группа: Участник Сообщений: 19 Регистрация: 21.12.2011 Пользователь №: 3085 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Алексей1153, я неверно не очень понимаю суть объекта QTimer. В чем проблема, что я его остановил потом? В промежуток между стартом и стопом выполяняется затратный по времени код.
|
|
|
Алексей1153 |
![]()
Сообщение
#7
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
Ov3r1oad, у тебя однопоточное приложение. Пока ты не вышел из функции func у тебя ни одно сообщение системы не обработается без специальных приёмов.
Расскажи задачу |
|
|
Ov3r1oad |
![]()
Сообщение
#8
|
Студент ![]() Группа: Участник Сообщений: 19 Регистрация: 21.12.2011 Пользователь №: 3085 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Алексей1153, ну в общем, я уже по сути все рассказал =). Вот мне нужно, чтобы каждую 0.1 секунду для кода, который между стартом и стопом, вызывалась функция (в которой меняется уровень ProgressBar). Все равно для меня не очень понятен механизм работы QTimer. Получается, я должен вызвать start и stop в разных функциях?
|
|
|
kuzulis |
![]()
Сообщение
#9
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 393 Регистрация: 29.6.2009 Пользователь №: 862 Спасибо сказали: 36 раз(а) Репутация: ![]() ![]() ![]() |
Ov3r1oad,
нужно или выпрямить рученки, или грамотно запостить свой код. А по теме: а я не вижу (ну никак) слота
вижу только приватный метод func(). И не поленись, смотри что оно тебе говорит в консоль, наверняка тоже скажет, что нет слота func(). |
|
|
Ov3r1oad |
![]()
Сообщение
#10
|
Студент ![]() Группа: Участник Сообщений: 19 Регистрация: 21.12.2011 Пользователь №: 3085 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
kuzulis, да это опечатка, слот это, слот. Я просто даже не вижу, как здесь отредактировать сообщение.
|
|
|
zloiia |
![]()
Сообщение
#11
|
![]() Студент ![]() Группа: Участник Сообщений: 25 Регистрация: 5.5.2011 Пользователь №: 2655 Спасибо сказали: 5 раз(а) Репутация: ![]() ![]() ![]() |
А может пускай таймер постоянно квакает, но в слоте update() смотреть на какой-то внешний флаг активности, который поднимается в object::func() ?
|
|
|
ilyabvt |
![]()
Сообщение
#12
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 297 Регистрация: 23.6.2011 Пользователь №: 2765 Спасибо сказали: 45 раз(а) Репутация: ![]() ![]() ![]() |
Ov3r1oad Функция stop() останавливает ваш таймер. Если вы ее вызываете сразу после start() то ваш таймер даже одного раза не успевает отработать.
В функции func() нужно вызвать только start(). А stop() нужно вызвать только после того как ваш таймер выполнит то что ему полагается. В вашем случае это достижение ProgressBar уровня 100%. Значит вам следует либо в функции update() проверять уровень ProgressBar или извне вызвать функцию stop() когда уровень ProgressBar достигнет 100%. Цитата Получается, я должен вызвать start и stop в разных функциях? Да |
|
|
Ov3r1oad |
![]()
Сообщение
#13
|
Студент ![]() Группа: Участник Сообщений: 19 Регистрация: 21.12.2011 Пользователь №: 3085 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
ilyabvt, Так в функции update() и меняется ProgressBar =), а в этот update, собственно и не заходит вообще программа. Тут видимо надо вызывать поток отдельный для этого таймера.
|
|
|
ilyabvt |
![]()
Сообщение
#14
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 297 Регистрация: 23.6.2011 Пользователь №: 2765 Спасибо сказали: 45 раз(а) Репутация: ![]() ![]() ![]() |
Ov3r1oad Конечно не заходит, ведь вы его остановили. Уберите функцию stop() из func() и поместите ее в update().
Цитата Тут видимо надо вызывать поток отдельный для этого таймера. Не надо! |
|
|
Steklova Olga |
![]()
Сообщение
#15
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 198 Регистрация: 27.9.2011 Из: Санкт-Петербург Пользователь №: 2912 Спасибо сказали: 5 раз(а) Репутация: ![]() ![]() ![]() |
Ov3r1oad,
смотрите код
если не хотите делать две кнопки, то смотрите код
Присоединяюсь к словам "Расскажи задачу" (конкретнее, про "затратный по времени код") (прежде чем думать о потоках) ![]() P.S. А сообщения запрещено Вам пока редактировать как новичку. |
|
|
Ov3r1oad |
![]()
Сообщение
#16
|
Студент ![]() Группа: Участник Сообщений: 19 Регистрация: 21.12.2011 Пользователь №: 3085 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Steklova Olga, ilyabvt, В общем, есть вот большой класс, наследуемый от QDialog. В нём куча кнопок, виджетов и прочей требухи. Так же там есть функция, ну допустим, сжатия файлов. Она, эта функция, затратная по времени, и мне нужно, чтобы пользователь понимал, что вот идёт архивация, и приложение не зависло (как ему может показаться). Для этого я хочу, чтобы на ProgressBar шкала просто двигалась назад и вперед, пока идёт архивация. То он нажимает на кнопку "Архивация", в слоте для этой кнопки лежит вот эта функция архивации. Что мне нужно сделать, чтобы прогрессбар у меня обновлялся?
|
|
|
Алексей1153 |
![]()
Сообщение
#17
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
Ov3r1oad, тебе нужно запустить процесс сжатия в отдельном потоке, тогда диалог не перестанет реагировать на сообщения от системы
|
|
|
Steklova Olga |
![]()
Сообщение
#18
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 198 Регистрация: 27.9.2011 Из: Санкт-Петербург Пользователь №: 2912 Спасибо сказали: 5 раз(а) Репутация: ![]() ![]() ![]() |
Алексей1153, а в Qt нет чего-нибудь типа дельфийского Application.ProcessMessages ?
|
|
|
Алексей1153 |
![]()
Сообщение
#19
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
Steklova Olga, это не дельфийское, это виндоапишное ) В таких случаях городится костыль - локальная петля обработки сообщений. Но костыль - он и есть костыль , лучше через поток ИМХО. В Qt я не заморачивался поиском такого подпинывателя, а сейчас глянул - нашёл только для перерисовки, для остальных сообщений не нашёл
И - если сделать по-виндошному, то не будет кроссплатформенности Сообщение отредактировал Алексей1153 - 27.2.2012, 19:48 |
|
|
BRE |
![]()
Сообщение
#20
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: ![]() ![]() ![]() |
Алексей1153, а в Qt нет чего-нибудь типа дельфийского Application.ProcessMessages ? Ну если я правильно понимаю, что делает Application.ProcessMessages в делфи, то в Qt есть несколько штатных средств для обработки скопившихся сообщений в очереди: QCoreApplication::processEvents(...) и QEventLoop::processEvents(...) |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 3.5.2025, 13:51 |