Название: Qt Script и многопоточность Отправлено: 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 выполняется не сразу, а отложенно через очередь сообщений и уже в потоке сигнала? Т.е., если я к тому моменту уже успею в скрипте удалить объект с ф-ей приёмником сигнала, то и произойдёт это самое падение. Название: Re: Qt Script и многопоточность Отправлено: Sasha от Август 27, 2015, 17:25 Похоже моё предположение неверно - видимо, вчера, увидев QObjectConnectionManager::execute я решил что это ф-я установки соединения (к тому же я почему-то видел, что ф-я вызывалась не в потоке скрипта). Сейчас у меня эта ф-я вызывается в потоке скрипта и теперь я предполагаю, что это не ф-я соединения, а общая ф-я через которую идут данные от сигнала к слоту. Причём в моём случае, эта ф-я вызывается из очереди эвентов, что и понятно, поскольку сигнал и слот в разных потоках.
Т.е. теперь моё предположение такое: Падает из-за следующей цепочки событий: 1) поток 1 послал сигнал 2) данные сигнала попали в очередь событий, т.к. слот в другом потоке 2 3) поток 2 разъединил сигнал и слот, да ещё и убил объект приёмник 4) поток 2 вычитал событие о сигнале и попытался вызвать слот, которого нет 5) Выдался ASSERT Кто-нибудь с таким сталкивался? Потому, что, если моё предположение верно, сильно усложняется возможность разъединять сигналы со слотами в скриптах работающих не в том потоке, в котором высылается сигнал. Я уже натыкался на подобное и написал тест, но тест не со скриптом. И там всё работало нормально, т.е. вышеизложеная цепочка событий не приводила к падению. |