Russian Qt Forum
Ноябрь 22, 2024, 00:36
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Qt Script, QtWebKit
>
Qt Script и многопоточность
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Qt Script и многопоточность (Прочитано 4134 раз)
Sasha
Гость
Qt Script и многопоточность
«
:
Август 26, 2015, 21:41 »
Здравствуйте,
Писал ли кто-нибудь Qt-скрипты выполняемые в отдельном потоке, да ещё и общающиеся с другим потоком посредством сигнал-слотов?
У меня такая проблемма:
1) Есть нативный код, работающий в потоке 1 и высылающий некоторый сигнал в котором передаёт строчки
2) Есть Qt-скрипт работающий в потоке 2.
3) Скрипт периодически подключает/отключает свою ф-ю, точнее ф-ю своего объекта к сигналу нативного кода.
И вот в какой-то момент программа падает, точнее выдаёт assert "
slot && slot.isObject()
" из недр Qt (ф-я void QObjectConnectionManager::execute(int slotIndex, void **argv)). причём эта ф-я работает не в потоке 1.
Правильно ли я предполагаю, что, вызывая в скрипте connect с сигналом из другого потока, этот самый connect выполняется не сразу, а отложенно через очередь сообщений и уже в потоке сигнала? Т.е., если я к тому моменту уже успею в скрипте удалить объект с ф-ей приёмником сигнала, то и произойдёт это самое падение.
Записан
Sasha
Гость
Re: Qt Script и многопоточность
«
Ответ #1 :
Август 27, 2015, 17:25 »
Похоже моё предположение неверно - видимо, вчера, увидев QObjectConnectionManager::execute я решил что это ф-я установки соединения (к тому же я почему-то видел, что ф-я вызывалась не в потоке скрипта). Сейчас у меня эта ф-я вызывается в потоке скрипта и теперь я предполагаю, что это не ф-я соединения, а общая ф-я через которую идут данные от сигнала к слоту. Причём в моём случае, эта ф-я вызывается из очереди эвентов, что и понятно, поскольку сигнал и слот в разных потоках.
Т.е. теперь моё предположение такое:
Падает из-за следующей цепочки событий:
1) поток 1 послал сигнал
2) данные сигнала попали в очередь событий, т.к. слот в другом потоке 2
3) поток 2 разъединил сигнал и слот, да ещё и убил объект приёмник
4) поток 2 вычитал событие о сигнале и попытался вызвать слот, которого нет
5) Выдался ASSERT
Кто-нибудь с таким сталкивался?
Потому, что, если моё предположение верно, сильно усложняется возможность разъединять сигналы со слотами в скриптах работающих не в том потоке, в котором высылается сигнал.
Я уже натыкался на подобное и написал тест, но тест не со скриптом. И там всё работало нормально, т.е. вышеизложеная цепочка событий не приводила к падению.
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...