4 / 4 / 0
Регистрация: 13.10.2013
Сообщений: 180
|
|
1 | |
Запуск методов экземпляра класса, переданного в QThread09.01.2019, 09:51. Показов 1471. Ответов 4
Метки нет (Все метки)
Всем привет.
Вопрос в следующем. У меня есть поток, в который с помощью moveToThread я переместил ранее созданный экземпляр класса. Мне хочется вызывать методы этого класса напрямую из двух других потоков. Для этого я передал в них ссылку на экземпляр класса. Я подозреваю, что небезопасно запускать методы в такой ситуации напрямую, а механизм сигналов и слотов использовать не хочется из за необходимости плодить слоты для получения результата выполнения методов класса, переданного в поток. Вопрос в том, являются ли в данной ситуации сигналы и слоты единственным методом решения проблемы или есть другие механизмы?
0
|
09.01.2019, 09:51 | |
Ответы с готовыми решениями:
4
Запуск методов класса в отдельных потоках Нужно ли самому удалять экземпляр класса, унаследованного от QThread? Почему при вызове метода у экземпляра класса он сначала ищет у экземпляра Создание экземпляра класса, разрушение экземпляра класса |
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
|
|
09.01.2019, 14:01 | 2 |
Kapitan79, вне зависимости от того, в какой поток будет отнесён QObject, прямой вызов его метода будет выполняться именно в том потоке, который осуществляет вызов метода. Т.е. если речь о потоке интерфейса, то в нём всё и будет происходить.
Для того, чтобы выполнялся именно отдельный поток, нужны сигналы и слоты, связанные с помощью QObject::connect с опцией соединения Qt::QueuedConnection или Qt::AutoConnection(по умолчанию). Тогда неявно организуется очередь, в которую будет помещаться вызванный сигнал и затем обрабатываться в отдельном потоке в слоте. Кстати именно поэтому в сигналы-слоты нужно передавать объекты по значению (а не ссылки и не указатели) - они будут записываться в очередь и храниться в ней всё время, пока отдельный поток не дойдёт до их обработки. Добавлено через 2 минуты Есть. Отправка и обработка эвентов. Но это более сложный способ, сигналы-слоты проще. Добавлено через 33 секунды И считается устаревшим, хотя и поддерживается.
1
|
4 / 4 / 0
Регистрация: 13.10.2013
Сообщений: 180
|
|
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 |
0
|
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
|
|
17.01.2019, 12:02 | 5 |
0
|
17.01.2019, 12:02 | |
17.01.2019, 12:02 | |
Помогаю со студенческими работами здесь
5
При создании экземпляра класса, создается 2 экземпляра вместо 1 Создание нового экземпляра дочернего класса из экземпляра базового Сложение экземпляра базового класса и экземпляра наследника Как вызвать определенный метод переданного класса через метод другого класса? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |