Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [Qt]Помогите разобраться с QThread |
Автор: nullpoint 25.6.2015, 10:22 |
Добрый день. Добрался до многопоточного программирования и никак не могу разобраться. Например, есть стандартное графическое приложение MainWindow. На форме есть поля для ввода двух матриц, поля для вывода ответа и кнопка, при нажатии на которую запускаются действия с матрицами. Каким образом вынести перемножение матриц и их сложение в параллельные потоки? Функции сложения и перемножения реализованы в одном классе. Не писать же для каждой функции отдельный класс и помещать объект этих классов в отдельный поток. |
Автор: math64 25.6.2015, 11:37 |
В данном случае можно воспользоваться модулем QtConcurent, класс QFutureWatcher<>. Вместе с Qt идёт пример по паралелному открытию нескольких изображений. Аналочичным способом можно паралельно складывать и перемножать матрицы. При использовании QtConcurent автоматически определяется оптимальное количество потоков и расределяются задания между ними. |
Автор: nullpoint 26.6.2015, 13:13 |
math64, спасибо за ответ. Перемножение матриц я привел просто для примера. Меня в общем случае интересует как выполнять методы реализованные в одном классе в параллельных потоках. Во всех найденных примерах, в классе реализован один ключевой метод, который нужно выполнить в отдельном потоке. А как быть с несколькими методами? |
Автор: math64 29.6.2015, 10:55 |
Если требуются разные задания (но не очень много) - используй QThread. Если требуется множество однотипных заданий - используй QtConcurent. Нужные QThread будут созданы автоматически и задания будут между ними распределены. Если нужно выпольнить множество заданий нескольких типов, можно использовать switch. Если выполнение одного задания зависит от другого - QtConcurent не подходит, придётся программировать вручную с помощью QThread. |
Автор: nullpoint 29.6.2015, 11:32 | ||
math64, можете объяснить поглубже? Например, есть такой класс:
Как мне выполнить method1() и method2() в разных потоках с помощью QThread? |
Автор: math64 29.6.2015, 14:34 | ||||
1.
2.
|
Автор: nullpoint 30.6.2015, 09:43 | ||
math64, спасибо за примеры кода, но это все же несколько не то, про что я говорил. Тут опять же создается класс наследуемый от QThread, а сами разработчики Qt говорят, что это не совсем правильный путь. Меня интересует, как не создавая собственного класса потоков, выполнять функции в разных потоках. Т.е. что-то типа такого я хочу получить без наследования класса QThread:
|
Автор: kuzulis 30.6.2015, 10:00 | ||
Никак. Весь код (функции и прочее), которые должны выполняться в другом потоке должны быть внутри QThread::run().. Т.е. в любом случае нужно создавать наследника от QThread. Есть вариант перемещения *всего* объекта в поток, тогда все функции объекта будут выполняться в том потоке, в который объект был перемещен. Для этого не нужно наследоваться от QThread. Для данной цели (запуска функций в потоках) уже советовали выше использовать QFutureWatcher<>. PS: И вообще, для этого есть примеры и документация.. Читайте - изучайте - пробуйте. |
Автор: nullpoint 30.6.2015, 10:39 |
kuzulis, так вот я и изучаю документацию. Вопрос и возник из-за того, что в примерах используется наследование от QThread. Хотел узнать возможно ли без этого. Спасибо за ответ. |
Автор: math64 30.6.2015, 13:26 | ||
Использование moveToThread() мне представляется так:
Но я не пробовал - может не заработает. Если экземпляр myClass должен быть один, нужен вспомогательный класс, который из слота вызовет нужный метод - method1() или method2(). Но тогда проще унаследоваться от QThread. |