![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| X-3R1 |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 63 Регистрация: 28.4.2007 Репутация: 1 Всего: 2 |
Есть такой код
Проблема заключается в том, что пока цикл не отработает, свойство connectButton и сигнал setStatus не вступят в силу. Хотя по логике вещей
должны выполняться в месте вызова. Кто-нибудь уже сталкивался с такой проблемой, или знает как всё расставить на свои места? |
||||
|
|||||
| Ken |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 47 Регистрация: 31.3.2007 Репутация: 2 Всего: 4 |
Как вы хотели увидеть вступление в силу
Если вы хотите видеть изменение внешнего вида connectButton то этого не произойдет пока ваша подпрограмма не завершится и управление не вернется в цикл сообщений. Потому что перерисовка идет не сразу. Всего лишь вызывается метод invalidate () который просто генерирует сообщение о перерисовке. Есть несколько простых правил: 1) Не использовать длинные вычисления в GUI потоке, постарайтесь как можно поскорее делать свои дела и вернуться в цикл сообщений; 2) Если длинные вычисления неизбежны, постарайтесь делить их на разные короткие фазы и активизировать их периодически, например, через таймер (
Это сообщение отредактировал(а) Ken - 28.4.2007, 15:33 |
||||
|
|||||
| nickless |
|
|||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
Насколько я знаю emit работает асинхронно, т.е. слоты вполне могут быть вызваны когда до них дойдёт очередь, попробуй вызвать setStatus напрямую.
-------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
|||
|
||||
| Ken |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 47 Регистрация: 31.3.2007 Репутация: 2 Всего: 4 |
Не всегда. emit работает асинхронно только тогда когда connect сигнала и слота делается с аргументом Qt::QueuedConnection. Или Qt::AutoConnection и emit вызывается из другого потока. В остальных случаях emit прямо вызывает метод. Это сообщение отредактировал(а) Ken - 28.4.2007, 15:38 |
|||
|
||||
| X-3R1 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 63 Регистрация: 28.4.2007 Репутация: 1 Всего: 2 |
Т.е. для того чтобы реализовать то что задумал надо "вычисления" выполнять в основном потоке, а "текущее состояние" выводить в GUI в другом потоке?) >попробуй вызвать setStatus напрямую Вряд ли поможет, т.к. свойства connectButton приходят в силу также после "вычислений". |
|||
|
||||
| Ken |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 47 Регистрация: 31.3.2007 Репутация: 2 Всего: 4 |
Длинных вычислений выполнять как раз в другом потоке надо чтобы долго не блокировать цикл сообщений. Добавлено @ 17:01 Постарайтесь не использовать потоков если можете разделить свои вычисления на мелкие фазы. Потому что с появлением потоков вам придется заниматься еще с синхронизацией потоков, отлаживать таких програм иногда бывает непросто. Но если все таки решили использовать потоки то постарайтесь прямо не вызвать методы GUI объектов из вашего потока, вместо этого сгенерируйте сигналы (emit) и обязательно связывайте их с вашими слотами через Qt::QueuedConnection. Это будет гарантировать что все GUI методы будут вызваны в основном потоке (GUI потоке). Это сообщение отредактировал(а) Ken - 28.4.2007, 17:04 |
|||
|
||||
| X-3R1 |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 63 Регистрация: 28.4.2007 Репутация: 1 Всего: 2 |
2Ken, благодарю за помощь
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |