Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
class Thread : public QThread
{
Q_OBJECT
private slots:
void onTimeout()
{
qDebug() << "Thread::onTimeout вызван из потока: " << QThread::currentThreadId();
}
private:
void run()
{
qDebug() << "Поток-работник:" << currentThreadId();
QTimer timer;
connect(&timer, SIGNAL(timeout()), this, SLOT(onTimeout()));
timer.start(1000);
exec();
}
};
run()
{
....
Object a;
....
connect(&timer, SIGNAL(timeout()), &a, SLOT(onTimeout()));
....
}
Object *a;
run()
{
....
a = new Object();
}
где-то после во внешнем коде
connect(&timer, SIGNAL(timeout()), &a, SLOT(onTimeout()));
QObject::connect() есть пятый аргумент: тип соединения. По умолчанию там Qt::AutoConnection. Что делается при выстреле сигнала, определяется в рантайме по типу соединения. Вот в этом месте.QSerialPort serial;
// Блокируем поток для инициализации переменных потока
mutex.lock();
// Имя текущего COM-порта
QString currentPortName = m_portName;
// Время ожидания ответа
int currentWaitTimeout = m_waitTimeout;
// Информация, отправляемая в COM-порт
QByteArray currentRequest = m_request;
mutex.unlock();
// Открываем COM-порт
if (serial.open(QIODevice::ReadWrite))
{
Для уверенности, что в процессе инициализации значения переменных не будут изменены извне. Возможно это лишнее, такие действия основываются на тех примерах, которые идут с Qt.
Инициализацию ресурсов мне кажется не очень правильно делать в одном потоке, а использование в другом, кто даст гарантию в таком случае, что на середине передачи значения, в массиве, который передается, не изменятся из другого потока?!
void MasterThread::transaction(const QString &portName, int waitTimeout, const QString &request)
{
QMutexLocker locker(&mutex);
this->portName = portName;
this->waitTimeout = waitTimeout;
this->request = request;
....
}
Presenter – это связующее звено между View и Model.
Qt + MVP + QThread. Строим свой велосипед