зависание программы написанной на Qt |
Здравствуйте, гость ( Вход | Регистрация )
зависание программы написанной на Qt |
eldar85 |
17.3.2010, 23:20
Сообщение
#1
|
программист Группа: Участник Сообщений: 283 Регистрация: 2.1.2010 Из: Москва Пользователь №: 1348 Спасибо сказали: 0 раз(а) Репутация: 0 |
столкнулся со странной проблемой, написал программу, отлично все работает, но если она выполняет процесс и по окну ткнешь мышью, окно зависает и пишет что программа не отвечает, но действие все же она свое доделывает до конца, потому как после окончания выполнения процесса она выдает конечный результат и окно стает опять активным) хотелось бы понять почему так происходит, ниужели чтобы программа работала без зависания я не могу даже просто свернуть окошко проги?
может какие то ошибки наделал, очень нужен совет мастеров Qt) |
|
|
BRE |
17.3.2010, 23:33
Сообщение
#2
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
Скорее всего, ты выполняешь какие-то долгие действия и не обрабатываешь события (не крутишь цикл обработки событий).
В процессе выполнения этих действий, нужно как минимум вызывать: void QCoreApplication::processEvents ( QEventLoop::ProcessEventsFlags flags = QEventLoop::AllEvents ) [static] или выполнять эти действия в отдельном потоке. |
|
|
eldar85 |
18.3.2010, 3:09
Сообщение
#3
|
программист Группа: Участник Сообщений: 283 Регистрация: 2.1.2010 Из: Москва Пользователь №: 1348 Спасибо сказали: 0 раз(а) Репутация: 0 |
да процесс на самом деле долгий и обрабатывать событие я пока не умею))
у меня идет процесс в цикле for. for находиться в слоте, получается я нажимаю кнопку и запускается этот цикл, он работает с сетью, он может повториться и сто и 1000 раз, это может занимать от нескольких секунд, до пары минут и в это время окно лучше не трогать, а то зависает))) а это вызов void QCoreApplication::processEvents ( QEventLoop::ProcessEventsFlags flags = QEventLoop::AllEvents ) [static] нужно делать в этом самом цикле for или где то отдельно? я еще новичек просто в кьюти, поэтому сложно догадаться сразу что и куда) спасибо что откликаетесь) Сообщение отредактировал eldar85 - 18.3.2010, 4:59 |
|
|
maint |
18.3.2010, 5:14
Сообщение
#4
|
Участник Группа: Участник Сообщений: 235 Регистрация: 3.8.2009 Из: Иркутск Пользователь №: 982 Спасибо сказали: 28 раз(а) Репутация: 2 |
да процесс на самом деле долгий и обрабатывать событие я пока не умею)) у меня идет процесс в цикле for. for находиться в слоте, получается я нажимаю кнопку и запускается этот цикл, он работает с сетью, он может повториться и сто и 1000 раз, это может занимать от нескольких секунд, до пары минут и в это время окно лучше не трогать, а то зависает))) а это вызов void QCoreApplication::processEvents ( QEventLoop::ProcessEventsFlags flags = QEventLoop::AllEvents ) [static] нужно делать в этом самом цикле for или где то отдельно? я еще новичек просто в кьюти, поэтому сложно догадаться сразу что и куда) спасибо что откликаетесь) можно еще внутри цикла рисовать qApp->processEvents();. И не проблема это qt, а любого языка (среды). На первом курсе преподают |
|
|
BRE |
18.3.2010, 7:30
Сообщение
#5
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
for находиться в слоте, получается я нажимаю кнопку и запускается этот цикл, он работает с сетью, он может повториться и сто и 1000 раз, это может занимать от нескольких секунд, до пары минут и в это время окно лучше не трогать, а то зависает))) В Qt есть возможность работать с сетью асинхронно, тогда таких проблем не будет. а это вызов void QCoreApplication::processEvents ( QEventLoop::ProcessEventsFlags flags = QEventLoop::AllEvents ) [static] нужно делать в этом самом цикле for или где то отдельно? Да, в этом самом цикле. Но это все таки не очень удобно, интерфейс как бы "оживет", но все равно программа ничего существенного сделать не сможет, пока этот цикл не отработает. Посмотри в примерах, как работать с сетью асинхронно или выполняй "тяжелые" действия в отдельных потоках. |
|
|
eldar85 |
18.3.2010, 11:55
Сообщение
#6
|
программист Группа: Участник Сообщений: 283 Регистрация: 2.1.2010 Из: Москва Пользователь №: 1348 Спасибо сказали: 0 раз(а) Репутация: 0 |
подставил qApp->processEvents(); и все стало отлично)))) прога вообще перестала виснуть)))а то я уже пару месяцев копаюсь по вечерам, прога очень большая будет и как то особо не заморачивался что она подвисает, дело то она свое один хрен доделывает))) а тут уже дописал ее и прям что то захотелось чтобы все было красиво и не зависало)))
большое спасибо всем за помощь!!))) Сообщение отредактировал eldar85 - 18.3.2010, 12:02 |
|
|
Текстовая версия | Сейчас: 19.12.2024, 9:23 |