![]() |
|
|
![]()
|
|
| Elfet |
|
||||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
Всем привет!
Первый раз работаю с многопоточностью вообще, так что не знаю может ли это вызывать проблемы? (моя программа начинает вылетать по непонятной мне причине, я думаю проблема в многопоточности) У меня есть некий класс унаследованный от QThread, в нём такая функция:
В ней я вызываю итерации: solver->Iteration(i), в них происходит решение и заполнение неких величин varsIn. Затем посылается сигнал emit Progress(i) - где происходит перерисовка графиков, сетки и прочие изменения в интерфейсе. Данные берутся из varsIn. Так вот программа иногда начинает вылетать при перерисовке сетки на вот этой вот строчке:
Может ли быть это связанно с многопоточностью? Если да - то как решить? Возможно нужно после посылки сигнала emit Progress(i) подождать когда он отработает и только потом переходить к сл итерации? Как можно это сделать? Какие другие варианты? Заранее спасибо! |
||||
|
|||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
Всё зависит от того, как ты сделал connect сигнала Progress, и какого типа у тебя i. А вообще IMHO очень мало данных для анализа. Выложи исходники
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
i - просто int. Соединил при помощи connect. Все исходники можно найти тут:
http://code.google.com/p/smart-flow/source/browse/#svn/trunk Функция solver->Iteration(int) находится здесь: SmartFlowLib/Source/Solvers/Solver.cpp Класс-наследник от Qthread: SmartFlow/IterationThread.h SmartFlow/IterationThread.cpp Соединяю в это файле, в конструкторе формы (строка 89): SmartFlow/mainwindow.cpp Слот принимающий сигнал (функция void MainWindow::ProgressIteration(int value), начиняющуюся со строки 27) : SmartFlow/mainwindow_menu.cpp Код по отрисовки интерфейса (программу выкидывает на 283 строке): SmartFlow/Renders/Render3D.cpp#238 Добавлено через 2 минуты и 54 секунды Очень прошу помочь! Диплом горит! |
|||
|
||||
| Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
Можно ли сделать как-нибудь что бы интерфейс имел бы более низкий приоритет, мне важно что бы решение не прерывалось.
|
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
Кода очень много, разбираться во всём - IMHO твоё дело. Можно попробовать для проверки виновата ли многопоточность соеденить сигнал со слотом через Qt::BlockingQueuedConnection
В этом случае отрисовка будет происходить последовательно с обработкой. Если перестанет вылетать - то виновата многопоточность, т.е. при отрисовке параллельно используются данные, изменяемые при обработке. Эти данные необходимо будет "лочить". QMutex'ом например -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
borisbn, ясно. Спасибо. А можно ли лочить при помощи boost::mutex? (правда там я нашёл только функции lock() и unlock() - как проверить что данные не залочены? можете дать ссылку на какой-нибудь хороший пример
Добавлено через 9 минут и 9 секунд С этим перестало падать: Qt::BlockingQueuedConnection - значит много поточность. |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
Можно чем угодно. boost::mutex ничем не лучше и не хуже других А зачем ? Если ты делаешь lock, то эта функция не отдаст тебе управление, пока тот, кто захватил данные с помощью lock не отпустит их с помощью unlock
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
ясно, спасибо!
ещё заметил странную штуку, заменил функцию size(), на empty() - стало меньше вылетать. |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
Поверь опыту, "меньше вылетать" - это плохо (как бы это не парадоксально звучало). Идеально - это когда вылетает всегда: быстро находишь и исправляешь ошибку. Если вылетает не всегда, но часто - тоже неплохо: не очень быстро, но найдёшь ошибку и исправишь. Когда вылетает очень редко - плохо: будешь очень долго искать ошибку или ситуацию, которая приводит к ошибке. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| Elfet |
|
|||
![]() Белый и Пушистый ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 3776 Регистрация: 2.4.2003 Репутация: нет Всего: 16 |
borisbn, ага. Пока пожалуй оставлю Qt::BlockingQueuedConnection, потом попробую mutex приделать.
|
|||
|
||||
![]()
|
| Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
| 1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |