Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt] Возможны ли тут проблемы с многопоточностью? 
:(
    Опции темы
Elfet
Дата 1.5.2010, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



Всем привет!

Первый раз работаю с многопоточностью вообще, так что не знаю может ли это вызывать проблемы? (моя программа начинает вылетать по непонятной мне причине, я думаю проблема в многопоточности)

У меня есть некий класс унаследованный от QThread, в нём такая функция:
Код

void IterationThread::run()
{
    is_runing = true;

    boost::shared_ptr<Solver> solver = sflib->GetSolver().lock();

    while(solver->Iteration(i))
    {
        emit Progress(i);

        if(!is_runing)
        {
            return;
        }
    }

    emit Finished();
}


В ней я вызываю итерации: solver->Iteration(i), в них происходит решение и заполнение неких величин varsIn. 

Затем посылается сигнал emit Progress(i) - где происходит перерисовка графиков, сетки и прочие изменения в интерфейсе. Данные берутся из varsIn. 

Так вот программа иногда начинает вылетать при перерисовке сетки на вот этой вот строчке:
Код

if(element->varsIn.size() != 0)


Может ли быть это связанно с многопоточностью? Если да - то как решить?  Возможно нужно после посылки сигнала emit Progress(i) подождать когда он отработает и только потом переходить к сл итерации? Как можно это сделать? Какие другие варианты?

Заранее спасибо!


--------------------
PM MAIL WWW Skype   Вверх
borisbn
Дата 2.5.2010, 08:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Всё зависит от того, как ты сделал connect сигнала Progress, и какого типа у тебя i. А вообще IMHO очень мало данных для анализа. Выложи исходники


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Elfet
Дата 2.5.2010, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: 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 секунды
Очень прошу помочь! Диплом горит!  smile 


--------------------
PM MAIL WWW Skype   Вверх
Elfet
Дата 2.5.2010, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



Можно ли сделать как-нибудь что бы интерфейс имел бы более низкий приоритет, мне важно что бы решение не прерывалось. 


--------------------
PM MAIL WWW Skype   Вверх
borisbn
Дата 2.5.2010, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Кода очень много, разбираться во всём - IMHO твоё дело. Можно попробовать для проверки виновата ли многопоточность соеденить сигнал со слотом через Qt::BlockingQueuedConnection
Код

connect(iterationThread, SIGNAL(Progress(int)), this, SLOT(ProgressIteration(int)), Qt::BlockingQueuedConnection );

В этом случае отрисовка будет происходить последовательно с обработкой.
Если перестанет вылетать - то виновата многопоточность, т.е. при отрисовке параллельно используются данные, изменяемые при обработке. Эти данные необходимо будет "лочить". QMutex'ом например


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Elfet
Дата 2.5.2010, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



borisbn, ясно. Спасибо. А можно ли лочить при помощи boost::mutex? (правда там я нашёл только функции lock() и unlock() - как проверить что данные не залочены? можете дать ссылку на какой-нибудь хороший примерsmile

Добавлено через 9 минут и 9 секунд
С этим перестало падать: Qt::BlockingQueuedConnection - значит много поточность.


--------------------
PM MAIL WWW Skype   Вверх
borisbn
Дата 2.5.2010, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Цитата(Elfet @  2.5.2010,  20:01 Найти цитируемый пост)
А можно ли лочить при помощи boost::mutex?

Можно чем угодно. boost::mutex ничем не лучше и не хуже других

Цитата(Elfet @  2.5.2010,  20:01 Найти цитируемый пост)
как проверить что данные не залочены?

А зачем ? Если ты делаешь lock, то эта функция не отдаст тебе управление, пока тот, кто захватил данные с помощью lock не отпустит их с помощью unlock

Код

void foo1()
{
    m_locker->lock(); // отсюда не выйдет, пока (1)
    // работа с данными
    m_locker->unlock();
// (2)
}

void foo2()
{
    m_locker->lock(); // отсюда не выйдет, пока (2)
    // работа с данными
    m_locker->unlock();
// (1)
}



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Elfet
Дата 2.5.2010, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



ясно, спасибо! 

ещё заметил странную штуку, заменил функцию size(), на empty() - стало меньше вылетать.


--------------------
PM MAIL WWW Skype   Вверх
borisbn
Дата 3.5.2010, 00:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Цитата(Elfet @  2.5.2010,  23:33 Найти цитируемый пост)
стало меньше вылетать

Поверь опыту, "меньше вылетать" - это плохо (как бы это не парадоксально звучало). Идеально - это когда вылетает всегда: быстро находишь и исправляешь ошибку. Если вылетает не всегда, но часто - тоже неплохо: не очень быстро, но найдёшь ошибку и исправишь. Когда вылетает очень редко - плохо: будешь очень долго искать ошибку или ситуацию, которая приводит к ошибке.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Elfet
Дата 3.5.2010, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

Репутация: нет
Всего: 16



borisbn, ага. Пока пожалуй оставлю  Qt::BlockingQueuedConnection, потом попробую mutex приделать.


--------------------
PM MAIL WWW Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0559 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.