4 / 4 / 0
Регистрация: 13.10.2013
Сообщений: 166
1

Запуск методов экземпляра класса, переданного в QThread

09.01.2019, 09:51. Показов 903. Ответов 4
Метки нет (Все метки)

Всем привет.
Вопрос в следующем.

У меня есть поток, в который с помощью moveToThread я переместил ранее созданный экземпляр класса.

Мне хочется вызывать методы этого класса напрямую из двух других потоков. Для этого я передал в них ссылку на экземпляр класса.
Я подозреваю, что небезопасно запускать методы в такой ситуации напрямую, а механизм сигналов и слотов использовать не хочется из за необходимости плодить слоты для получения результата выполнения методов класса, переданного в поток.

Вопрос в том, являются ли в данной ситуации сигналы и слоты единственным методом решения проблемы или есть другие механизмы?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.01.2019, 09:51
Ответы с готовыми решениями:

Запуск методов класса в отдельных потоках
Столкнулся со следующей проблемой. Есть некий класс, методы которого должны выполняться каждый в...

Нужно ли самому удалять экземпляр класса, унаследованного от QThread?
Привет! Есть класс, унаследованный от QThread с макросом Q_OBJECT, создаю я этот экземпляр при...

Почему при вызове метода у экземпляра класса он сначала ищет у экземпляра
Всем привет, после прочтения Лутца про ООП появился такой вопрос почему при вызове метода у...

Создание экземпляра класса, разрушение экземпляра класса
Не могу найти информацию про разрущение экземпляра класса. Объясните пожалуйста, что это?

4
зомбяк
1543 / 1185 / 336
Регистрация: 14.05.2017
Сообщений: 3,846
09.01.2019, 14:01 2
Kapitan79, вне зависимости от того, в какой поток будет отнесён QObject, прямой вызов его метода будет выполняться именно в том потоке, который осуществляет вызов метода. Т.е. если речь о потоке интерфейса, то в нём всё и будет происходить.
Для того, чтобы выполнялся именно отдельный поток, нужны сигналы и слоты, связанные с помощью QObject::connect с опцией соединения Qt::QueuedConnection или Qt::AutoConnection(по умолчанию). Тогда неявно организуется очередь, в которую будет помещаться вызванный сигнал и затем обрабатываться в отдельном потоке в слоте. Кстати именно поэтому в сигналы-слоты нужно передавать объекты по значению (а не ссылки и не указатели) - они будут записываться в очередь и храниться в ней всё время, пока отдельный поток не дойдёт до их обработки.

Добавлено через 2 минуты
Цитата Сообщение от Kapitan79 Посмотреть сообщение
или есть другие механизмы
Есть. Отправка и обработка эвентов. Но это более сложный способ, сигналы-слоты проще.

Добавлено через 33 секунды
И считается устаревшим, хотя и поддерживается.
1
4 / 4 / 0
Регистрация: 13.10.2013
Сообщений: 166
17.01.2019, 06:53  [ТС] 3
Спасибо за ваш ответ.

Суть моих сомнений состоит в следующем.

Есть объект1 и объект2. Объект1 крутится в основном потоке, объект2 переведён в другой поток с помощью moveToThread и в его конструктор передан указатель на объект1.
У каждого потока есть свой цикл событий. Из документации я знаю, что при использовании сигналов и слотов вызов слота включается в цикл событий соответствующего потока.

Что произойдёт, если я из объекта2 запущу метод в объекте1 напрямую без использования сигналов и слотов через указатель на него? Будет этот вызов этого метода встроен в цикл событий потока объекта1 или такое действие небезопасно?

Добавлено через 13 минут
Если есть ссылка на подробное описание в официальной документации этого механизма, скиньте пожалуйста. Именно что происходит в описанной мной ситуации. Если я ничего не пропустил, непосредственно в описании QObject есть только упоминание о работе с сигналами и слотами.
0
278 / 87 / 37
Регистрация: 10.06.2015
Сообщений: 261
17.01.2019, 11:41 4
Цитата Сообщение от Kapitan79 Посмотреть сообщение
Что произойдёт, если я из объекта2 запущу метод в объекте1 напрямую без использования сигналов и слотов через указатель на него? Будет этот вызов этого метода встроен в цикл событий потока объекта1
Уже ответили же.
Цитата Сообщение от TRam_ Посмотреть сообщение
вне зависимости от того, в какой поток будет отнесён QObject, прямой вызов его метода будет выполняться именно в том потоке, который осуществляет вызов метода.
0
зомбяк
1543 / 1185 / 336
Регистрация: 14.05.2017
Сообщений: 3,846
17.01.2019, 12:02 5
Цитата Сообщение от Kapitan79 Посмотреть сообщение
У каждого потока есть свой цикл событий.
Вот в потоке 2 и будет происходить обработка вызова метода объекта 1.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.01.2019, 12:02

При создании экземпляра класса, создается 2 экземпляра вместо 1
Подсчет экземпляров ведется с помощью статического члена num_dogs, который во всех трех...

Создание нового экземпляра дочернего класса из экземпляра базового
Всем привет! Извиняюсь, если вопрос глупый, но что-то не смог найти конкретный ответ на него... ...

Сложение экземпляра базового класса и экземпляра наследника
Добрый вечер! Моя задача - сложить экземпляр базового класса и наследника. Нужно сделать так, чтобы...

Как вызвать определенный метод переданного класса через метод другого класса?
Добрый день. Захотел я вызвать в методе класса метод некоего другого класса, о котором я пока не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.