|
|
|
nullpoint |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 51 Регистрация: 4.6.2013 Репутация: нет Всего: нет |
Добрый день. Добрался до многопоточного программирования и никак не могу разобраться.
Например, есть стандартное графическое приложение MainWindow. На форме есть поля для ввода двух матриц, поля для вывода ответа и кнопка, при нажатии на которую запускаются действия с матрицами. Каким образом вынести перемножение матриц и их сложение в параллельные потоки? Функции сложения и перемножения реализованы в одном классе. Не писать же для каждой функции отдельный класс и помещать объект этих классов в отдельный поток. |
|||
|
||||
math64 |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
В данном случае можно воспользоваться модулем QtConcurent, класс QFutureWatcher<>.
Вместе с Qt идёт пример по паралелному открытию нескольких изображений. Аналочичным способом можно паралельно складывать и перемножать матрицы. При использовании QtConcurent автоматически определяется оптимальное количество потоков и расределяются задания между ними. |
|||
|
||||
nullpoint |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 51 Регистрация: 4.6.2013 Репутация: нет Всего: нет |
math64, спасибо за ответ. Перемножение матриц я привел просто для примера. Меня в общем случае интересует как выполнять методы реализованные в одном классе в параллельных потоках. Во всех найденных примерах, в классе реализован один ключевой метод, который нужно выполнить в отдельном потоке. А как быть с несколькими методами?
|
|||
|
||||
math64 |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Если требуются разные задания (но не очень много) - используй QThread.
Если требуется множество однотипных заданий - используй QtConcurent. Нужные QThread будут созданы автоматически и задания будут между ними распределены. Если нужно выпольнить множество заданий нескольких типов, можно использовать switch. Если выполнение одного задания зависит от другого - QtConcurent не подходит, придётся программировать вручную с помощью QThread. |
|||
|
||||
nullpoint |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 51 Регистрация: 4.6.2013 Репутация: нет Всего: нет |
math64, можете объяснить поглубже? Например, есть такой класс:
Как мне выполнить method1() и method2() в разных потоках с помощью QThread? |
|||
|
||||
math64 |
|
||||
Эксперт Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
1.
2.
Это сообщение отредактировал(а) math64 - 29.6.2015, 14:43 |
||||
|
|||||
nullpoint |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 51 Регистрация: 4.6.2013 Репутация: нет Всего: нет |
math64, спасибо за примеры кода, но это все же несколько не то, про что я говорил. Тут опять же создается класс наследуемый от QThread, а сами разработчики Qt говорят, что это не совсем правильный путь. Меня интересует, как не создавая собственного класса потоков, выполнять функции в разных потоках. Т.е. что-то типа такого я хочу получить без наследования класса QThread:
|
|||
|
||||
kuzulis |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 154 Регистрация: 5.9.2007 Репутация: нет Всего: 1 |
Никак. Весь код (функции и прочее), которые должны выполняться в другом потоке должны быть внутри QThread::run().. Т.е. в любом случае нужно создавать наследника от QThread. Есть вариант перемещения *всего* объекта в поток, тогда все функции объекта будут выполняться в том потоке, в который объект был перемещен. Для этого не нужно наследоваться от QThread. Для данной цели (запуска функций в потоках) уже советовали выше использовать QFutureWatcher<>. PS: И вообще, для этого есть примеры и документация.. Читайте - изучайте - пробуйте. |
|||
|
||||
nullpoint |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 51 Регистрация: 4.6.2013 Репутация: нет Всего: нет |
kuzulis, так вот я и изучаю документацию. Вопрос и возник из-за того, что в примерах используется наследование от QThread. Хотел узнать возможно ли без этого. Спасибо за ответ.
|
|||
|
||||
math64 |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Использование moveToThread() мне представляется так:
Но я не пробовал - может не заработает. Если экземпляр myClass должен быть один, нужен вспомогательный класс, который из слота вызовет нужный метод - method1() или method2(). Но тогда проще унаследоваться от QThread. |
|||
|
||||
Правила форума "С/С++: Кроссплатформенное программирование, 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. |