Russian Qt Forum
Ноябрь 22, 2024, 14:16 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: Правильное использование многопоточности  (Прочитано 25087 раз)
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #15 : Январь 28, 2016, 09:25 »

А вот интересен вопрос реализации и прироста скорости.
У меня имеется подобная задачка, отложенная на потом.
Как эффективнее использовать потоки?
Я полагаю, что должен быть 1 поток, который будет читать данные в QStringList, тем самым формируя очередь для парсинга. В это время другие потоки начинают парсить полученные данные в QList результатов. Причём потоков для парсинга должно соответствовать QThread::idealThreadCount().

Как считаете? Жизнеспособно? Прирост скорости получится значительный?
Записан
Bepec
Гость
« Ответ #16 : Январь 28, 2016, 09:32 »

Тут надо смотреть именно на объем работ. Если простой парсинг, прирост будет незначительный. Если парсинг с созданием структур, выделением памяти и преобразованиями - прирост возможно будет, а мб будет замедление из-за малой нагрузки на поток.
PS как говаривал сенсей, нужно разбирать каждый конкретный случай. Одно условие может поменять всё Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #17 : Январь 28, 2016, 09:44 »

1) Выясните сколько % времени уходит чисто на чтение, просто отключите теперешний парсинг. Учтите что эффект будет/возможен только для разницы между "полным" временем и "только чтение"

2) Выясните насколько в данном случае притормаживает удобный но жирный QString. Для чтения попробуйте читать файл как двоичный (raw data), для парсинга - смотрите сами

Потом о чем-то уже можно будет говорить
Записан
egorsmkv
Гость
« Ответ #18 : Январь 28, 2016, 12:59 »

Исправил

Освойте https://github.com/ / https://bitbucket.org/ -- проще же будет проекты хранить, иметь к ним доступ, тут и знания о контролях версий появятся, а они в it-компаниях всегда используются, да и не нужно будет перезаливать Улыбающийся
Не раз было, что в некоторых статья на хабре можно было встретить, выложенный автором проект на файлообменник, ссылка которого, конечно, давно дохлая

Я его использую, но не хочу пока туда такой сырой код выкладывать
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #19 : Январь 28, 2016, 15:46 »

egorsmkv, заведите отдельную ветку для сырого кода. А потом сольёте со стабильной.
Записан
egorsmkv
Гость
« Ответ #20 : Январь 28, 2016, 20:17 »

Сделал - https://github.com/egorsmkv/qt-multithreading
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #21 : Январь 28, 2016, 20:41 »


Интересно будет посмотреть Улыбающийся
Записан

egorsmkv
Гость
« Ответ #22 : Январь 28, 2016, 21:03 »


Там всё довольно тривиально реализовано. Покритикуйте хотя-бы то, что есть.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #23 : Январь 29, 2016, 10:37 »

Там всё довольно тривиально реализовано. Покритикуйте хотя-бы то, что есть.
Здесь нужно захватить мутекс
Код
C++ (Qt)
void Worker::resumeThreads() {
//  QMutexLocker lock(&sync);
 pause = 0;
 cond.wakeAll();
}
 
Вообще QWaitCondition здесь не очень лепится, обычно он связывается с выемкой задач из очереди, но тут это уже делает Qt
Записан
egorsmkv
Гость
« Ответ #24 : Январь 29, 2016, 16:55 »

Там всё довольно тривиально реализовано. Покритикуйте хотя-бы то, что есть.
Здесь нужно захватить мутекс
Код
C++ (Qt)
void Worker::resumeThreads() {
//  QMutexLocker lock(&sync);
 pause = 0;
 cond.wakeAll();
}
 
Вообще QWaitCondition здесь не очень лепится, обычно он связывается с выемкой задач из очереди, но тут это уже делает Qt


Мьютекс для pause?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #25 : Январь 29, 2016, 17:03 »

Мьютекс для pause?
В первую очередь для условной переменной.
Записан
egorsmkv
Гость
« Ответ #26 : Январь 29, 2016, 17:12 »

Мьютекс для pause?
В первую очередь для условной переменной.

Это не простая переменная, а QAtomicInt
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #27 : Январь 29, 2016, 17:13 »

Это не простая переменная, а QAtomicInt
Условная переменная это cond.
Записан
egorsmkv
Гость
« Ответ #28 : Январь 29, 2016, 17:50 »

Понял.

Вместо QWaitCondition что лучше использовать?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #29 : Январь 29, 2016, 17:54 »

Вместо QWaitCondition что лучше использовать?
Это зависит от того, что хотим получить. Улыбающийся
Если вам нужна эта пауза, то условная переменная для этого подходит.
« Последнее редактирование: Январь 29, 2016, 17:56 от Old » Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.15 секунд. Запросов: 23.