![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
Raw Gift |
![]() ![]()
Сообщение
#1
|
![]() Новичок Группа: Новичок Сообщений: 3 Регистрация: 15.11.2008 Пользователь №: 422 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Здравствуйте, уважаемые форумчане!
Столкнулся с совершенно непонятной для меня проблемой. Есть небольшая программка, разбитая на два потока: поток GUI (основной, соответственно) и поток вычислений. Механизм работы следующий: когда пользователь выставляет все настройки в GUI и нажимает кнопочку, запускаются вычисления в отдельном потоке. При этом в GUI перед созданием потока создается окошко с QProgressBar, которое вызывается после запуска потока:
При этом взаимодействуют поток вычислений и поток GUI (точнее говоря, progressForm) посредством сигналов. Не знаю, насколько это верное решение, но все работает прекрасно. Кроме того, иногда в процессе вычислений может возникнуть "вопрос" к пользователю, т.е. надо показать диалоговое окошко с QListWidget с вариантами "ответа", и только после этого продолжать вычисления. Я, не особо задумываясь, взял да и воткнул создание этого диалога в поток вычислений (т.к. вычисления все равно на время должны прерываться). После этого я просто получал результат (QListWidget::currentIndex().row()) и продолжал вычисления:
Все работало замечательно, пока я не решил собрать программу в Debug-версии. Qt ругнулся на меня assert'ом, мол, нельзя создавать виджеты не в GUI потоке и я с ним согласился. Казалось бы, чего проще, создаем myListDialog внутри GUI потока и передаем указатель конструктору потока вычислений:
Внутри потока вычислений все остается так же точно, как и было:
Но не тут-то было. Каким-то магическим образом получается так, что в QListWidget выделение не отображается, но результат выделения сохраняется. Причем, интересно, если нажать кнопочку Ок диалога, но убрать с нее курсор мышки, выделение таки покажется. Путем плясок с бубном и всякими focusPolicy, а также windowModality, мне удалось добиться того, что первый вариант выбора (кликнули первый раз в список) показывается, а остальные нет. Ума не приложу, что вообще происходит... ![]() Искренне признателен за всякую помощь! |
|
|
![]() |
Raw Gift |
![]()
Сообщение
#2
|
![]() Новичок Группа: Новичок Сообщений: 3 Регистрация: 15.11.2008 Пользователь №: 422 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Не знаю-не знаю... Мне тут подсказывают, что дедлок мог случиться. В принципе, очень логично: программа разбита на потоки, которые засинхронизированы несколько кривовато... Только вот откуда дедлок в этом конкретном месте... Черт его знает. В общем, как разберусь - напишу!
|
|
|
![]() ![]() ![]() |
![]() |
Текстовая версия | Сейчас: 11.3.2025, 15:20 |