crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> зависание программы написанной на 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  


Цитата(eldar85 @ 18.3.2010, 3:09) *
да процесс на самом деле долгий и обрабатывать событие я пока не умею))
у меня идет процесс в цикле 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  


Цитата(eldar85 @ 18.3.2010, 3:09) *
for находиться в слоте, получается я нажимаю кнопку и запускается этот цикл, он работает с сетью, он может повториться и сто и 1000 раз, это может занимать от нескольких секунд, до пары минут и в это время окно лучше не трогать, а то зависает)))

В Qt есть возможность работать с сетью асинхронно, тогда таких проблем не будет.

Цитата(eldar85 @ 18.3.2010, 3:09) *
а это вызов 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
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


5 чел. читают эту тему (гостей: 5, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 19.12.2024, 9:31