Можете объяснить moveToThread()?04.05.2018, 15:18. Показов 13076. Ответов 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
|
|||||||
|
2737 / 892 / 331
Регистрация: 10.02.2018
Сообщений: 2,136
|
||
| 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
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман.
Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
|
|
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
|
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
|
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ
Основная суть и тезисы по измерениям:
0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема.
Объект не может перемещаться в 0D.
1D (Первое измерение):. . .
|
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek
ВВЕДЕНИЕ
Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
|