Size: a a a

2020 July 10

RR

Ramil Rizvanov in Qt
Vitaly Farmov
Это и есть QObject::connect
в connect указывается ConnectionType , по дефолту вызов слота кидается в очередь, нет? а у меня как раз по дефолту
источник

M

Mr.Mait in Qt
Ramil Rizvanov
господа, а можно без сигнала добавить в очередь (event queue) вызов слота с аргументами? просто сделать очередной сигнал и очередной коннект будет лишним
Первый вариант
QMetaObject::invokeMethod(this, [this, msg]{
  callSlot(msg);
}, Qt::QueuedConnection);
Второй вариант
QMetaObject::invokeMethod(this, "callSlot", Qt::QueuedConnection, Q_ARG(QString, msg));

У первого варианта преимущества:
*Можно вообще не слот вызывать.
*Работает рефакторинг переименование.
*Первый аргумент this можно поставить любой объект, тогда выполнится в том потоке, что и находится сам объект

У второго варианта минус в том, что только слоты, переименовать только ручками, не правильно написал название слота, узнаешь в рантайме. Всего максимум 10 аргументов
источник

VF

Vitaly Farmov in Qt
Ramil Rizvanov
в connect указывается ConnectionType , по дефолту вызов слота кидается в очередь, нет? а у меня как раз по дефолту
По дефолту autoconnection, что = directConnection при условии, что испускающая и принимающая сторона находятся в одном потоке. Все написано в документации
источник

VF

Vitaly Farmov in Qt
Ramil Rizvanov
в connect указывается ConnectionType , по дефолту вызов слота кидается в очередь, нет? а у меня как раз по дефолту
Проведи эксперимент: задай тип коннекшна вручную и посмотри, что будет
источник

RR

Ramil Rizvanov in Qt
Vitaly Farmov
Проведи эксперимент: задай тип коннекшна вручную и посмотри, что будет
connect(controller, &Controller::emitMessage,  this, &StatusWindow::logMessage, Qt::QueuedConnection);


и по прежнему имеем
ConnectingState
ConnectedState
Connect ok
источник

RR

Ramil Rizvanov in Qt
или я не так понял мысль?
источник

M

Mr.Mait in Qt
Ramil Rizvanov
connect(controller, &Controller::emitMessage,  this, &StatusWindow::logMessage, Qt::QueuedConnection);


и по прежнему имеем
ConnectingState
ConnectedState
Connect ok
По исходникам отправляется первый сигнал setState(ConnectingState); если было изначальное состояние UnconnectedState
После сигнала вызывается open(). В open если нормально открылось, то отправляется сигнал setState(QModbusDevice::ConnectedState);
источник

VF

Vitaly Farmov in Qt
Ramil Rizvanov
connect(controller, &Controller::emitMessage,  this, &StatusWindow::logMessage, Qt::QueuedConnection);


и по прежнему имеем
ConnectingState
ConnectedState
Connect ok
Ну конечно, это же твой код. А те сигналы они в qt коде. Мысль была в том, чтобы самому посмотреть различие в типах коннекшна, написав свой небольшой пример
источник

M

Mr.Mait in Qt
Ты вызываешь modbusDevice.connectDevice(). Внутри отправились два сигнала в таком порядке
1) ConnectingState
2) ConnectedState
Завершается вызов connectDevice(), этот метод возвращает true или false, потом отправляется твой сигнал
3) emitMessage

Вот как я понял тебя
источник

RR

Ramil Rizvanov in Qt
Mr.Mait
По исходникам отправляется первый сигнал setState(ConnectingState); если было изначальное состояние UnconnectedState
После сигнала вызывается open(). В open если нормально открылось, то отправляется сигнал setState(QModbusDevice::ConnectedState);
1) ConnectingState
2) ConnectedState
каждое изменение состояния вызывает сигнал QModbusServer::stateChanged, где внутри слота я делаю тоже emitMessage
источник

RR

Ramil Rizvanov in Qt
при том что я явно указал
connect(controller, &Controller::emitMessage,  this, &StatusWindow::logMessage, Qt::QueuedConnection);
источник

RR

Ramil Rizvanov in Qt
emitMessage как-то вызывается до окончания modbusDevice.connectDevice().
источник

RR

Ramil Rizvanov in Qt
хотя когда сделал
connect(&modbusDevice, &QModbusServer::stateChanged, this, &Controller::onStateChanged, Qt::QueuedConnection);

то стало как и ожидается
Connect ok
ConnectingState
ConnectedState
источник

RR

Ramil Rizvanov in Qt
в общем, всем спасибо, никакого async await в qt нет, работаем дальше
источник

M

Mr.Mait in Qt
И еще , в исходнике такое нашел
//Connected is set by backend -> might be delayed by event loop
источник

RR

Ramil Rizvanov in Qt
да тоже видел такое
источник

RR

Ramil Rizvanov in Qt
Ramil Rizvanov
хотя когда сделал
connect(&modbusDevice, &QModbusServer::stateChanged, this, &Controller::onStateChanged, Qt::QueuedConnection);

то стало как и ожидается
Connect ok
ConnectingState
ConnectedState
наверное имелось ввиду это
источник

RR

Ramil Rizvanov in Qt
ConnectedState возвелся после завершения connectDevice
источник

Е

Егор in Qt
А вас по какому имени называть?
источник

RG

Renat Garaev in Qt
Егор
А вас по какому имени называть?
Думает, какое из трех правильное😂
источник