Russian Qt Forum
Ноябрь 22, 2024, 04:48 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Qt Script и многопоточность  (Прочитано 4136 раз)
Sasha
Гость
« : Август 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
Гость
« Ответ #1 : Август 27, 2015, 17:25 »

Похоже моё предположение неверно - видимо, вчера, увидев QObjectConnectionManager::execute я решил что это ф-я установки соединения (к тому же я почему-то видел, что ф-я вызывалась не в потоке скрипта). Сейчас у меня эта ф-я вызывается в потоке скрипта и теперь я предполагаю, что это не ф-я соединения, а общая ф-я через которую идут данные от сигнала к слоту. Причём в моём случае, эта ф-я вызывается из очереди эвентов, что и понятно, поскольку сигнал и слот в разных потоках.
Т.е. теперь моё предположение такое:
Падает из-за следующей цепочки событий:
1) поток 1 послал сигнал
2) данные сигнала попали в очередь событий, т.к. слот в другом потоке 2
3) поток 2 разъединил сигнал и слот, да ещё и убил объект приёмник
4) поток 2 вычитал событие о сигнале и попытался вызвать слот, которого нет
5) Выдался ASSERT
Кто-нибудь с таким сталкивался?
Потому, что, если моё предположение верно, сильно усложняется возможность разъединять сигналы со слотами в скриптах работающих не в том потоке, в котором высылается сигнал.
Я уже натыкался на подобное и написал тест, но тест не со скриптом. И там всё работало нормально, т.е. вышеизложеная цепочка событий не приводила к падению.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.046 секунд. Запросов: 21.