Можете объяснить moveToThread()?04.05.2018, 15:18. Показов 13020. Ответов 36
Метки нет (Все метки)
Как я понимаю объект,который перемещают, "уходит" в другой поток весь.
Т.е. this уже будет невалидным и все коннекты будут хоть и верными, но сигналы будут уходить в никуда. Что произойдёт с полями объекта? Если в конструкторе объекта создаю ,например, таймер, то неважно,когда я его законекчу. До вывода в отдельный поток или после-timeout не сработает.(точнее слот не будет вызван) Если же создам после сигнала started(QThread) - всё норм. Для корректной работы надо всегда делать пустой конструктор и дожидаться переноса в другой поток, а уж потом запускать "полноценный" конструктор? Если есть тонкости qt4 и qt5, также буду рад пояснениям.
0
|
|
| 04.05.2018, 15:18 | |
|
Ответы с готовыми решениями:
36
можете объяснить для чего нужно QWebView+movetoThread QUDPSocket + moveToThread |
|
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
|
||
| 10.05.2018, 16:07 | ||
|
0
|
||
| 10.05.2018, 16:35 [ТС] | |
|
Так в этом и вопрос,я описал в 14 посте.
Если я хочу обращаться к методам мэмбэра моего класса,перенесённого в другой поток, то мне нужно создавать их(мэмбэры) уже в новом потоке?
0
|
|
|
|
|||
| 10.05.2018, 19:00 | |||
|
Если они потокобезопасные, то можно вызывать их откуда хочешь.
0
|
|||
|
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
|
|
| 10.05.2018, 19:29 | |
|
0
|
|
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
|||||||
| 11.05.2018, 08:27 | |||||||
A::A() ):
0
|
|||||||
| 11.05.2018, 18:17 [ТС] | ||
|
Добавлено через 2 минуты Или все объекты, родителем которых является А, будут автоматически также перемещены в новый поток?
0
|
||
|
зомбяк
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
|
||||||||||||
| 11.05.2018, 18:25 | ||||||||||||
|
saqef, там явно написано что именно перемещаемый объект (т.е. который класса A) не должен иметь родителей. А наследников он может иметь сколько угодно.
Добавлено через 1 минуту А
0
|
||||||||||||
| 11.05.2018, 18:37 [ТС] | ||
|
С Qt понятно - надо всегда указывать родителя. А с членами, которые не являются наследниками от Qt, как быть? Всё равно наследоваться от qobject? Ведь иначе мэмбэры будут существовать в другом потоке.
0
|
||
|
|
||
| 11.05.2018, 19:05 | ||
|
0
|
||
|
|
||
| 11.05.2018, 19:19 | ||
Давайте разберём базу, в которой у вас проблемы. Чем отличаются два потока (не Qt) друг от друга? У каждого потока свой набор регистров и свой стек вызовов. Всё остальное - общее. Это означает, что нам, в общем, без разницы, кто запустит конструктор, - они все будут располагаться в общей памяти.Чем отличаются два потока (Qt)? У каждого Qt потока своя очередь сообщений. Для каждого потока в их общей памяти будет создано по QEventLoop. Каждый поток будет бегать в цикле по своему QEventLoop, пока не получит команду на выход. Бегая в цикле, поток будет брать из очереди сообщений очередное и прогонять его по всем привязанным к нему QObject'ам. Сигналы - это тоже сообщения.Так вот, когда у QObject'а есть родитель, он берёт сообщения из того же потока, что и родитель, в порядке очереди. Когда у QObject'а нет родителя, ему принудительно устанавливается тот поток, из которого он был создан. Теперь о проблеме. Вы выполняете A::A в потоке п1, а A::start в потоке п2. Если вы в потоке п1 создаёте таймер без родителя, а запускаете его явным вызовом из п2, п2 создаёт у себя событие активации таймера и оставляет в своей очереди. Когда наступает момент события, он его прогоняет по своим объектам. Но таймер привязан к п1, а, значит, у п2 нет объектов, которые могут принять это сообщение - и оно утилизируется. Но в самом таймере меняется внутреннее состояние на "запущен", то есть создаётся ситуация неопределённости. Не надо так делать. (И, нет, честных способов "у двух маток сосать" нету. И слава Богу!) Правильное решение - либо сразу привязать таймер к потоку п2 (не важно, где он будет создан, важно - вызвать moveToThread(п2) перед запуском), либо соединить запуск таймера с каким-либо сигналом из п2. Добавлено через 4 минуты Не по теме: Хотя тут нужно проверять всё по исходникам: в свой ли поток добавляет событие таймер - или в вызвавший; позволяет ли он производить конкурентные вызовы методов или нет, а у меня нет сорцов при себе.
1
|
||
|
|
|||||||
| 11.05.2018, 19:19 | |||||||
|
через QDebug все видно кто в каком потоке живет:
0
|
|||||||
|
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,132
|
||
| 11.05.2018, 21:37 | ||
|
0
|
||
| 01.06.2018, 14:48 [ТС] | ||||||||||||
|
Можете ещё подсказать насчёт переноса не qt-шных сущностей.
Так работает:
Но если я создам структуру в конструкторе,то при обращении к буферу ошибка обращении.
Что происходит? Ведь:
0
|
||||||||||||
|
|
|
| 01.06.2018, 15:41 | |
|
Не знаю, saqef, сам мне скажи, что это у тебя за структуры, и в каком месте стека вызовов с какой ошибкой приложение падает. Иначе зачем тебе отладчик?
Самое наивное предположение: m_struct - нечто большее, чем указатель на массив, и что-то остаётся не инициализированным. Казалось бы, смех да и только, но тут не всё так однозначно. А если хотите конкретики, делайте минимальный синтетический тест, повторяющий это поведение.
0
|
|
| 01.06.2018, 17:25 [ТС] | |
|
Повторяется всегда.
Структура моя. Самая простая: указатель на массив и его размеры. Вылет происходит когда пытаюсь обратиться к m_buffer[0],но только если создаётся в конструкторе.
0
|
|
| 01.06.2018, 17:25 | |
|
О работе с moveToThread Использование moveToThread
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет:
1. Использовать системное время и дату,
2. Есть возможность вводить время и дату вручную.
3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
|
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber.
Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
|
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео:
https:/ / vkvideo. ru/ video-240781534_456239017
YouTube:
eY5-5PyI9NM
Текстовая версия
|
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать
Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
|
|
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства.
Родственных связей существует 8 ступеней, такие как:
p - отец
P - мать
q - муж
Q - жена
b - брат
B - сестра
s - сын
S - дочь
|
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире.
Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
|