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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Доступ к сигналу из другого потока  (Прочитано 8325 раз)
SektorCT
Частый гость
***
Offline Offline

Сообщений: 229


Просмотр профиля
« : Январь 28, 2023, 22:47 »

Всем привет.
У меня класс который обращается к gui работает в отдельном потоке, и вроде нормально работало когда обращался к слотам.
Но мне теперь потребовалось реакцию на сигнал из С++.
В нужный qml добавил Connections { target: eventHandler; function onSignalAlertUserExists() {} } и вызвал сигнал.
И получаю теперь ошибку
QQmlEngine: Illegal attempt to connect to EventHandler(0x55.......) that is in a different thread than the QML engine QQmlApplicationEngine(0x7ff.........
Подскажите пожалуйста. С потоками я еще не идеально разбираюсь.
Спасибо.
Записан
SektorCT
Частый гость
***
Offline Offline

Сообщений: 229


Просмотр профиля
« Ответ #1 : Январь 31, 2023, 09:50 »

Никто такой ошибки не видел?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #2 : Январь 31, 2023, 10:39 »

решение лежит в первой же (или второй) ссылке в гугле:

You need to build a c++ model that lives in the main thread that is exposed to qml. Inside this model you can connect to signals emitted by your threads via a queuedconnection and link them to the models' own signals. Also you should make sure that when you read data from an object owned by another thread, everything is properly mutexed or you will be reading garbage.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
SektorCT
Частый гость
***
Offline Offline

Сообщений: 229


Просмотр профиля
« Ответ #3 : Январь 31, 2023, 16:11 »

решение лежит в первой же (или второй) ссылке в гугле:

Это в гугле не смог найти, искал несколько дней. По сути я понимаю что проблема в разных потоках. Но вот почему это приосходит если я из GUI обращаюсь к слотам то все работает а когда сигнал то получаю ошибку.

Код:
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
   
    ThreadsManagement management; // тут у меня классы буферов и eventHandler(для работы с GUI) и потоки для них
    QQmlApplicationEngine engine;
   
    engine.rootContext()->setContextProperty("eventHandler", management.getEventHandler());

    engine.addImportPath("qrc:/");
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    return app.exec();
}

Могли бы что-то посоветовать?
Спасибо.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #4 : Январь 31, 2023, 17:22 »

eventHandler живет в главном потоке, насколько я понимаю, потому проблемы из гуи нет.

в ответе же написано: надо создать свою С++ обертку, которая будет перенаправлять сигналы из других потоков в гуи, при этом соединение надо делать с типом queuedconnection (тип AutoConnection, который по умолчанию, может не сработать, т.к. смотрит на принадлежность объекта потоку лишь в момент вызова connect, насколько я помню). То есть в setContextProperty ты будешь передавать вот эту обертку (либо как замена eventHandler либо в дополнение к нему, тут сам смотри как тебе лучше).
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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