Потоки. Параллельные действия.
QTableWidget, QThread, threads
Доброго времени суток!
Нужен совет по много поточности.
Есть вот такая вот табличка.
Столбец статуc хотелось бы получать в потоке для всех записей (АЗС).
Для одной записи я реализовал получение статуса сервера базы данных.
Вопрос в том как делать это для всех записей, количество записей до 200 чтобы для каждой записи это делалось в потоке.
Реализация получения статуа в потоке
- CheckAzsStatus *checkStatus = new CheckAzsStatus(modelConnections->data(modelConnections->index(0,0,QModelIndex())).toInt(),
- modelConnections->data(modelConnections->index(0,1,QModelIndex())).toString());
- QThread *thread = new QThread(this);
- checkStatus->moveToThread(thread);
- connect(thread,&QThread::started, this, &ShowPage::slotStartExecute,Qt::DirectConnection);
- connect(thread,&QThread::started, checkStatus, &CheckAzsStatus::slotCheckAzsStatus,Qt::DirectConnection);
- connect(checkStatus,&CheckAzsStatus::signalSendResult,this,&ShowPage::slotGetAzsStatus);
- connect(checkStatus,&CheckAzsStatus::finished,this,&ShowPage::slotStopExecute);
- connect(checkStatus,&CheckAzsStatus::finished,thread,&QThread::quit);
- connect(checkStatus,&CheckAzsStatus::finished,checkStatus,&CheckAzsStatus::deleteLater);
- connect(thread,&QThread::finished, thread, &QThread::deleteLater);
- thread->start();
- }
- void ShowPage::slotStartExecute()
- {
- qInfo(logInfo()) << Q_FUNC_INFO << QDateTime::currentDateTime().toString("dd-MM-yyyy hh:mm:ss.zzz") << "Thread started";
- }
- void ShowPage::slotStopExecute()
- {
- qInfo(logInfo()) << Q_FUNC_INFO << QDateTime::currentDateTime().toString("dd-MM-yyyy hh:mm:ss.zzz") << "Thread stoped";
- }
- void ShowPage::slotGetAzsStatus(bool res)
- {
- if(res){
- ui->tableWidget->item(0,2)->setText("ON LINE");
- } else {
- ui->tableWidget->item(0,2)->setText("OFF LINE");
- }
- }
Реализация проверки
checkazsstatus.h
- #ifndef CHECKAZSSTATUS_H
- #define CHECKAZSSTATUS_H
- #include <QObject>
- class CheckAzsStatus : public QObject
- {
- Q_OBJECT
- public:
- explicit CheckAzsStatus(int term, QString ip, QObject *parent = nullptr);
- signals:
- void signalSendResult(bool status);
- void finished(int term);
- public slots:
- void slotCheckAzsStatus();
- private:
- QString m_serverName;
- int m_terminalID;
- };
- #endif // CHECKAZSSTATUS_H
checkazsstatus.cpp
- #include "checkazsstatus.h"
- #include "LoggingCategories/loggingcategories.h"
- #include <QTcpSocket>
- CheckAzsStatus::CheckAzsStatus(int term, QString ip, QObject *parent) : QObject(parent)
- {
- m_serverName = ip;
- m_terminalID = term;
- qInfo(logInfo()) << "IP" << m_serverName << "Terminal" << m_terminalID;
- }
- void CheckAzsStatus::slotCheckAzsStatus()
- {
- bool status;
- QTcpSocket *tcpSocket = new QTcpSocket();
- tcpSocket->connectToHost(m_serverName, 3050);
- if(tcpSocket->waitForConnected(30000)){
- status = true;
- } else {
- status = false;
- }
- emit signalSendResult(status);
- emit finished(m_terminalID);
- }
Буду благодарен за любою помошь.
5
253
Do you like it? Share on social networks!
- Last comments
- AKApril 1, 2025, 11:41 a.m.Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
- VPMarch 9, 2025, 4:14 p.m.Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
- ИМNov. 22, 2024, 9:51 p.m.Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
- Now discuss on the forum
- МАApril 1, 2025, 4:21 p.m.0ff763fe-4e50-455d-a3a6-5699c243b1a5_17_44_22_1.xml
- fFeb. 15, 2025, 1:46 p.m.Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
- Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
- Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
как то немного сомбурно выглядит описание. вы хотите получать статус 200 обьектов в отдельном потоке или для каждого свой поток? я так понял описание обьектов находится в бд?
Простите за сумбурность. :-)
Да для каждого объекта в своем потоке, поскольку связь с объектами оставляет желать лучшего.
При наличии связи с обектом на базе АЗС выполняется SQL запрос на получении информации ( в данном случае наименование видов топлива на АЗС)
Описание объектов в объекте QSqlTableModel, получаемой из базы данных.
как вариант (работать буде при неограниченном колличестве обьектов). добавьте в класс проверки статуса, полную реализацию проверки с сигналами и тд, только в конектах можно завязать не на слот класа а на новый сигнал, после в основном классе, можно сделать запрос в БД на получение данных о ваших обьектах (ID, IP и тд), и при разборе этих данных создавайте обьект проверки и сделайте перепривязку сигналов, при создании можете его пихнуть в вектор например, и перебором вектора пихать каждый обьект в отдельный поток для проверки(например QtConcurrent), а полученый результат через сигналы парсить
Придется в каждом потоке создавать свое соединение с БД: документация Qt
а смысл? соеденение с БД можно сделать глобальным и в потоке при запросе просто делать указание QSqlQuery query(str,db) документация
Алексей, данные об объектах я получаю.
Вопрос как раз в реализации. Перечитав кучу доков и форумов я только окончательно запутался. А хотелось бы просто посмотреть кусок рабочего кода. :-)
Это если в одном потоке. В параллельных потоках надо создавать соединение, причем с разными именами, пример:
Это я в курсе, мне в потоке не надо пока подключатся к БД.
Так не даст подключится. Для потока создается отдельный пулл подключений к БД. я с этим уже сталкивался.
проверено на практике - делаем глобальный
global.h
global.cpp
в основном классе
и потом в любом месте в любом потоке через
имеем доступ к единственному экземпляру БД, и больше ничего создавать не нужно
примерно так (кусок реализации работы с системами Satel)
soket.h
soket.cpp
в основном рабочем классе делал так
идею взял вот с этой книжки "Lazar G., Penea R. - Mastering Qt 5 - 2016"
Спасибо, но меня больше интересует реализация потоков.
а что мешает потом сделать так? (при определенных условиях, отправляется в отдельный поток на обработку, количество совпадений по условию не предсказуемо)
ну или попробывать такой вариант(ваш обьект в другом потоке останется жить пока не удалите)
Добрий вечір, не рекомендував би вам використоувати для цих цілей, багато потоків, один потік це приблизно 67мб (принаймні було в моєму випадку) і того вам на 200 потоків потрібно не мало памяті,
моя реалізація стосується роботи з QWebSocket короткий код нижче, все перевірено і працює, + не потрібно робити багато конекшинів з кожного потоку до бази, і не так важко реалізувати комунікацію
добрый день, мне кажется при таком количестве одновременных запросов лучше работать через брокер
я не знаю как у вас получилось 1поток=67мб (может у вас был не поток а процесс?). у меня есть проект, в нем постоянно активно 28 потоков, с таймерами и бесконечными циклами, и они регулярно стучат в БД,так вот там у меня с запущенным интерфейсом (QML) занято 105м,, без интерфейса все 42мб
Большое спасибо за наводящие ответы. :-)
QTcpSocket мне нужен всего лишь для проверки доступна ли удаленная база данных.
Если доступна, то тогда у же к ней будем обращаться с запросами.
отпишитесь потом по результатам, что получилось сколько занимает, и какая нагрузка в общем
Следующий этап это выполнение на каждой активной базе выполнять в потоке запрос
Вот там и будем мерять.
Потому что статистика выволнения не очень впечатляет :-)
Кстати вопрос на эту тему. QSqlQuery позволяет какимно образом получать такую информаци?
Реаизовал с использованием QtConcurent, дабы получить сигнал что все потоки по опросу порта завершились.
А как мерять :-)
просто скажите что по загрузке процессора и оперативы, когда происходит опрос
Можно просмотреть результаты тут
https://drive.google.com/file/d/1tFmrljPrxjqkb6OZSvCmF5uGtuHvlKPq/view?usp=sharing
мені важко це зараз навіть перевірити, тому що знайшов коміт, це ще було в 2016 році, і цей код не буде працювати коректно зараз, єдине скажу що це були QThread