#cpp #qt
Есть класс, отнаследованный от QThread, с переопределенным методом run() и вызовом exec() в конце метода. В данном классе определены необходимые для работы методы. Есть второй класс с определенными сигналами для вызова методов первого класса. Объект данного класса планируется создавать для обеспечения интерфейса доступа к методом первого класса, находящимся в другом потоке. Есть std::thread в котором создаются объекты этих классов и вызывается метод start() для первого класса. После создания объектов выполняется соединение сигналов с методами. Суть вопроса в следующем, при выборе ConnectionType::QueuedConnection ничего не работает, при выборе ConnectionType::DirectConnection методы первого класса начинают вызываться, но выдается предупреждение, что осуществляется доступ из другого потока. Куда смотреть? Почему не работает с ConnectionType::QueuedConnection. class Cls_1 : public QThread { Q_OBJECT public: Cls_1(); virtual ~Cls_1(){}; void Method_1(const double ¶m); private: void run(); }; Cls_1()::Cls_1() { } void Cls_1::run() { ... exec(); } void Cls_1::Method_1(const double ¶m) { ; } class Cls_2 : public QObject { Q_OBJECT public: Cls_2(); virtual ~Cls_2(){}; void Method_1(const double ¶m); signals: void SignalMethod_1(const double ¶m); } Cls_2()::Cls_2() { } void Cls_2::Method_1(const double ¶m) { emit SignalMethod_1(param); } Код создания и подключения: Cls_1 *obj_1 = new Cls_1(); obj_1->start(); _sleep(10000); Cls_2 *obj_2 = new Cls_2(); QObject::connect(obj_2, &Cls_2::SignalMethod_1, obj_1, &Cls_1::Method_1, Qt::ConnectionType::DirectConnection); obj_2->Method_1(1);
Ответы
Ответ 1
Вы создаёте cls2 в контексте текущего потока (который std::thread). Чтобы этот объект был привязан к потоку obj_1, надо сделать одно из двух: Создавать cls2 изнутри метода Cls_1::run(). Перепривязать созданный объект вызовом cls2->moveToThread(obj_1);.Ответ 2
Можно использовать прямой запуск слота без сигнала: QMetaObject::invokeMethod(receiverObject, "slotName", Qt::QueuedConnection);
Комментариев нет:
Отправить комментарий