Russian Qt Forum
Ноябрь 23, 2024, 04:06 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: Готовые модули для просмотра и редактирования БД  (Прочитано 19713 раз)
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #15 : Сентябрь 28, 2017, 13:56 »

А когда поток не работает останавливать его? Или в цикле со sleep гонять?
Может есть правильный пример?
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #16 : Сентябрь 28, 2017, 14:37 »

Для каждого подключения к БД создать поток, когда приходят запросы выполнять их, когда запросов нет гонять пустой цикл со slepp, перед закрытием подключения отключаться от БД?
QThreadPool? QTHread? QtConcurent... что выбрать?
Записан
Bepec
Гость
« Ответ #17 : Сентябрь 28, 2017, 15:08 »

Я решил проблему классом который держит объект соединения и дублирует функции слотами. Ну и собственно его и запуливаю в поток, сигналами и слотами шмалять.
Правда он крайне урезанный, поддерживает буквально exec, commit, ошибки.
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #18 : Октябрь 04, 2017, 12:23 »

Я решил проблему классом который держит объект соединения и дублирует функции слотами. Ну и собственно его и запуливаю в поток, сигналами и слотами шмалять.
Правда он крайне урезанный, поддерживает буквально exec, commit, ошибки.
А можно пример? И что делать когда задач нет sleep в цикле гонять?
Записан
Bepec
Гость
« Ответ #19 : Октябрь 04, 2017, 15:31 »

У меня он событийный поток. Т.е. там в run exec, а все задачи сигналами посылаются.
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #20 : Октябрь 05, 2017, 11:59 »

QSqlDatabase не является наследником QObject, поэтому у него нет метода moveToThread.
А так да, для каждой нитки нужно создавать отдельное подключение.
А что выбрать: moveTothread, QtConcurrent, Qthread, QThreadPool?

мне нужно class LibDB {public slots: setConfig(Config); int query(Qstring); signals void data(int id, QVariantList);}
Записан
Bepec
Гость
« Ответ #21 : Октябрь 05, 2017, 12:51 »

Я плохой советчик по потокам, т.к. я просто создаю класс наследуемый от QThread и делаю moveToThread в конструктор Веселый С другой стороны этот подход работает, не имеет никаких отрицательных сторон, кроме слабой переносимости Веселый
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #22 : Октябрь 05, 2017, 14:09 »

Создать несколько потоков(например 4), в конструкторе каждого потока:
db = QSqlDatabase::addDatabase()
db.open()
В деструкторе:
db.close()
?
Записан
Bepec
Гость
« Ответ #23 : Октябрь 05, 2017, 15:07 »

Не, у меня приложение не ресурсоёмкое, потому запросы выполняются последовательно. Т.е. 1 поток, одно соединение.
Хотя при частых запросах, создать несколько соединений... Хз, на мой неискушенный взгляд такое не особо сильно прибавит быстродействия.
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #24 : Октябрь 05, 2017, 16:31 »

А как из потока структуру вернуть?
прописал:
typedef QList<QVariantList> ResultFromDB;
Q_DECLARE_METATYPE(ResultFromDB)

консоль:
QObject::connect: Cannot queue arguments of type 'ResultFromDB'
(Make sure 'ResultFromDB' is registered using qRegisterMetaType().)
Записан
MrDron
Гость
« Ответ #25 : Октябрь 05, 2017, 17:33 »

А как из потока структуру вернуть?
прописал:
typedef QList<QVariantList> ResultFromDB;
Q_DECLARE_METATYPE(ResultFromDB)

консоль:
QObject::connect: Cannot queue arguments of type 'ResultFromDB'
(Make sure 'ResultFromDB' is registered using qRegisterMetaType().)

qRegisterMetaType<ResultFromDB>("ResultFromDB");

http://doc.qt.io/qt-5/qmetatype.html#qRegisterMetaType
« Последнее редактирование: Октябрь 05, 2017, 17:36 от MrDron » Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #26 : Октябрь 05, 2017, 23:36 »

Спасибо, заработало.
Как лучше результат из базы возвращать? ссылка/unique_ptr/по значению...?
qRegisterMetaType<My>("My") - это функция, вне кода(под структурой её не написать) где её лучше вызвать?
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #27 : Октябрь 06, 2017, 06:56 »

>>qRegisterMetaType<My>("My") - это функция, вне кода(под структурой её не написать) где её лучше вызвать?
можно в конструкторе где у тебя соединение создаётся
Записан

Юра.
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #28 : Октябрь 06, 2017, 10:31 »

У меня N потоков с QThread, как посылать сигнал DB::queryWork только одному? Вызвать слот напрямую в другом потоке вряд ли получиться, добавить идентификатор потока чтобы поток если это не ему не выполнял запрос?

Код:
    for(QThread *&threadDB: threadsDB) {
        threadDB = new QThread;
        Worker *worker = new Worker;
        worker->moveToThread(threadDB);

        connect(threadDB, &QThread::finished, worker, &QObject::deleteLater);
        connect(this, &DB::queryWork, worker, &Worker::queryWork);
        connect(this, &DB::workerConnectDB, worker, &Worker::connectDB);
        connect(this, &DB::workerDisconnectDB, worker, &Worker::disconnectDB);
        connect(worker, &Worker::queryResult, this, &DB::queryResult);
        threadDB->start(); }
Записан
MrDron
Гость
« Ответ #29 : Октябрь 06, 2017, 10:44 »

Вызвать слот напрямую в другом потоке вряд ли получиться
Слот, чтобы он выполнился в нужном потоке, можно написать:
Код
C++ (Qt)
QMetaObject::invokeMethod(worker, "queryWork");
Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.221 секунд. Запросов: 22.