Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Потоки в Qt и использование boost::mutex 
:(
    Опции темы
Elfet
Дата 9.5.2010, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Всем привет! 

Добавил в свою программу блокировку данных при помощи мьютекса из boost::mutex. Но теперь стал интерфейс сильно тормозить.
Вот как это у меня работает:
Код

void MyThread::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, блогирую я его тут:
Функция Solver::Iteration(int&p):
Код

bool Solver::Iteration(int &percent)
{
    // Блокировка
    boost::mutex::scoped_lock lock(mutex);
...

И в функции обновления интерфейса (она соединена со сигналом emit Progress(i))
Код

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

...

void MainWindow::ProgressIteration(int value)
{
    boost::shared_ptr<Solver> solver = sflib->GetSolver().lock();
    boost::mutex::scoped_lock lock(solver->mutex);

...


Интерфейс сильно тормозит.  Можно ли что-нибудь сделать что бы он не тормозил? Заранее спасибо!




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


Эксперт
****


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

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



Ты блокируешь функции обработки и отрисовки целиком. Попробуй определить место, где обработка и отображение обращаются к одним и тем же данным, и заблокировать только это место. А ещё лучше перед использованием данных в отображении заблокировать mutex, скопировать необходимые данные во временные переменные, разблокировать mutex и спокойно отображать сохранённые копии. При этом блокировать можно всю функцию обработки


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


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


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

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



А если данные очень большие? Я отображаю сетку (10тыс. - 100тыс. узлов) и копировать её целиком достаточно проблематично. Дольше всего работает естественно функция отрисовки сетки в интерфейсе. В библиотеке же дольше всего итерации по этой сетки. Есть ли какие-нибудь ещё альтернативы? 

Кстати хотел спросить кое-что ещё: я собираю библиотеку, которая должна потом использоваться в многопоточном приложении и хочу главный класс-интерфейс этой библиотеки разместить в синглтоне (потокобезопасном). Нормально ли это? 


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


Эксперт
****


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

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



Цитата(Elfet @  10.5.2010,  18:33 Найти цитируемый пост)
Я отображаю сетку (10тыс. - 100тыс. узлов)

неужели на каждом шаге обработки необходимо отображать все данные? Может стоит перекинуть часть обработки графика в поток (например подготовить там список QPoint'ов и скопировать его в интерфейсный поток). Может стоит отображать не на каждом шаге, а, например, каждый десятый.

Цитата(Elfet @  10.5.2010,  18:33 Найти цитируемый пост)
 главный класс-интерфейс этой библиотеки разместить в синглтоне (потокобезопасном). Нормально ли это? 

синглтон - зло. Это правило, из которого всегда есть исключения, однако по собственному опыту неоднократно в этом правиле убеждался. Лучше заблокировать данные на момент их копирования, чтобы обеспечить потокобезопасность.


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


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


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

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



Данные нужно бы отображать на каждом шаге - иначе не понятно как решение распространяться.  Странно вот что мне если я соединяю с помощью Qt::BlockingQueuedConnection:
Код

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

То интерфейс перестаёт тормозить.  smile  smile 


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


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 5
Всего: 44



офтоп: а зачем Вам boost::mutex? Ведь есть же QMutex
PM WWW   Вверх
Elfet
Дата 11.5.2010, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



chaos, мы в библиотеке не используем Qt. Qt только в интерфейсе.


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

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

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


 




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


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

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