Size: a a a

2020 July 15

VK

Valentin Kornienko in Qt
Тебе надо перебросить событие в UI-поток, если у тебя не-UI поток. Ты или используешь механизмы Qt для этого и кьютишные потоки. Или перекидываешь руками вызов слота в очередь нужного тебе потока( а вот тут я не подскажу, ибо не сталкивался )
источник

AS

Anatoly Shirokov in Qt
Побитый Кирпич
Нет, просто поток, который никак с Qt не связан
#include <QCoreApplication>
#include <QDebug>
#include <QVariant>

#include <chrono>
#include <thread>

class Mediator : public QObject {
 Q_OBJECT;

public:
 Mediator(QObject* parent = nullptr) : QObject(parent) {}

signals:
 void ready(QVariant data);

public:
 void send(QVariant data) { emit ready(data); }
};

int main(int argc, char* argv[]) {
 QCoreApplication a(argc, argv);
 qSetMessagePattern("%{category} %{time boot} %{threadid} %{message}");

 Mediator m;
 QObject::connect(&m, &Mediator::ready, &m, [&](QVariant data) {
   qDebug() << "receive" << data;
   a.quit();
 });

 std::thread([&]() {
   qDebug() << "wait";
   std::this_thread::sleep_for(std::chrono::seconds{5});
   qDebug() << "send";
   m.send(QVariant("read"));
 }).detach();

 return a.exec();
}

#include "main.moc"
источник

Е

Егор in Qt
Anatoly Shirokov
#include <QCoreApplication>
#include <QDebug>
#include <QVariant>

#include <chrono>
#include <thread>

class Mediator : public QObject {
 Q_OBJECT;

public:
 Mediator(QObject* parent = nullptr) : QObject(parent) {}

signals:
 void ready(QVariant data);

public:
 void send(QVariant data) { emit ready(data); }
};

int main(int argc, char* argv[]) {
 QCoreApplication a(argc, argv);
 qSetMessagePattern("%{category} %{time boot} %{threadid} %{message}");

 Mediator m;
 QObject::connect(&m, &Mediator::ready, &m, [&](QVariant data) {
   qDebug() << "receive" << data;
   a.quit();
 });

 std::thread([&]() {
   qDebug() << "wait";
   std::this_thread::sleep_for(std::chrono::seconds{5});
   qDebug() << "send";
   m.send(QVariant("read"));
 }).detach();

 return a.exec();
}

#include "main.moc"
А инклюд мока в конце чтобы в хедер не выносить?
источник

AS

Anatoly Shirokov in Qt
Егор
А инклюд мока в конце чтобы в хедер не выносить?
ну, чтобы пример состоял из одного файла, который можно кинуть в проект и скомпилировать
источник

Е

Егор in Qt
Anatoly Shirokov
ну, чтобы пример состоял из одного файла, который можно кинуть в проект и скомпилировать
ага, я просто редко вижу такое, решил переспросить
источник

AS

Anatoly Shirokov in Qt
Anatoly Shirokov
#include <QCoreApplication>
#include <QDebug>
#include <QVariant>

#include <chrono>
#include <thread>

class Mediator : public QObject {
 Q_OBJECT;

public:
 Mediator(QObject* parent = nullptr) : QObject(parent) {}

signals:
 void ready(QVariant data);

public:
 void send(QVariant data) { emit ready(data); }
};

int main(int argc, char* argv[]) {
 QCoreApplication a(argc, argv);
 qSetMessagePattern("%{category} %{time boot} %{threadid} %{message}");

 Mediator m;
 QObject::connect(&m, &Mediator::ready, &m, [&](QVariant data) {
   qDebug() << "receive" << data;
   a.quit();
 });

 std::thread([&]() {
   qDebug() << "wait";
   std::this_thread::sleep_for(std::chrono::seconds{5});
   qDebug() << "send";
   m.send(QVariant("read"));
 }).detach();

 return a.exec();
}

#include "main.moc"
вывод:
default 251061.723 18964 wait
default 251066.733 18964 send
default 251066.733 6000 receive QVariant(QString, "read")
источник

AS

Anatoly Shirokov in Qt
видно, что отправка данных идет из одного потока 18964, а прием идет в 6000, потоке UI
источник

ПК

Побитый Кирпич... in Qt
Anatoly Shirokov
#include <QCoreApplication>
#include <QDebug>
#include <QVariant>

#include <chrono>
#include <thread>

class Mediator : public QObject {
 Q_OBJECT;

public:
 Mediator(QObject* parent = nullptr) : QObject(parent) {}

signals:
 void ready(QVariant data);

public:
 void send(QVariant data) { emit ready(data); }
};

int main(int argc, char* argv[]) {
 QCoreApplication a(argc, argv);
 qSetMessagePattern("%{category} %{time boot} %{threadid} %{message}");

 Mediator m;
 QObject::connect(&m, &Mediator::ready, &m, [&](QVariant data) {
   qDebug() << "receive" << data;
   a.quit();
 });

 std::thread([&]() {
   qDebug() << "wait";
   std::this_thread::sleep_for(std::chrono::seconds{5});
   qDebug() << "send";
   m.send(QVariant("read"));
 }).detach();

 return a.exec();
}

#include "main.moc"
А тут есть ограничение на тип данных? Можно любой тип передавать в сигналы?
источник

AS

Anatoly Shirokov in Qt
Побитый Кирпич
А тут есть ограничение на тип данных? Можно любой тип передавать в сигналы?
Любой зарегенный в метасистеме типов Qt
источник

Е

Егор in Qt
А в куте нету аналога std::set? QSet не сортирует
источник

Е

Егор in Qt
не хотелось бы мешать разные библиотеки
источник

m

mefest in Qt
Егор
не хотелось бы мешать разные библиотеки
Это же std, не особо мешанина получается
источник

Е

Егор in Qt
mefest
Это же std, не особо мешанина получается
Мне потом прокидывать в qml нужно, приходится копировать постоянно
источник

ПК

Побитый Кирпич... in Qt
Anatoly Shirokov
Любой зарегенный в метасистеме типов Qt
Могу я так зарегать тип из 3rd party библиотеки?
Я правильно понимаю, что для этого мне надо вызвать эти две штуки:
Q_DECLARE_METATYPE(nlohman::json);

и
qRegisterMetaType<nlohman::json>();

И я смогу передавать nlohman::json в сигнал непосредственно?
источник

AS

Anatoly Shirokov in Qt
Побитый Кирпич
Могу я так зарегать тип из 3rd party библиотеки?
Я правильно понимаю, что для этого мне надо вызвать эти две штуки:
Q_DECLARE_METATYPE(nlohman::json);

и
qRegisterMetaType<nlohman::json>();

И я смогу передавать nlohman::json в сигнал непосредственно?
https://doc.qt.io/qt-5/custom-types.html :
a public default constructor,
a public copy constructor, and
a public destructor.
источник

AS

Anatoly Shirokov in Qt
если это все есть, регистрируй
источник

ПК

Побитый Кирпич... in Qt
Anatoly Shirokov
https://doc.qt.io/qt-5/custom-types.html :
a public default constructor,
a public copy constructor, and
a public destructor.
Ага, move only уже не сделаешь, значит? Смувать в GUI поток не получится, только копия или shared_ptr какйо нибудь?
источник

AS

Anatoly Shirokov in Qt
Побитый Кирпич
Ага, move only уже не сделаешь, значит? Смувать в GUI поток не получится, только копия или shared_ptr какйо нибудь?
Если положишь в QVariant значение зарегеного типа, то там уже заработают механизм COW без лишних копий, но с накладухой от QVariant:
MyCustomType o;
QVariant v = QVariant::fromValue(o);
MyCustomType o2 = v.value<MyType>();
источник

ПК

Побитый Кирпич... in Qt
Anatoly Shirokov
Если положишь в QVariant значение зарегеного типа, то там уже заработают механизм COW без лишних копий, но с накладухой от QVariant:
MyCustomType o;
QVariant v = QVariant::fromValue(o);
MyCustomType o2 = v.value<MyType>();
Ок, спасибо
источник

AS

Anatoly Shirokov in Qt
@top1pogromist Ну и QVariant, как контейнер, сделает интерфейс универсальным, класс Медиатор можно тогда использовать в разных местах, не привязаясь к конкретному кастомному типу
источник