|
4 / 4 / 5
Регистрация: 19.08.2016
Сообщений: 137
|
||||||||||||||||
Поведение QSqlDatabase23.02.2018, 17:12. Показов 1732. Ответов 21
Метки нет (Все метки)
Всем привет!
Использую класс для работы с БД MySQL. Вот он:
Программа (в том числе и класс DB) отрабатывает как надо, но не зря же я разместил в коде qDebug. Вот, что мы увидим в консоли, если два раза сынициируем создание потока (в котором создаётся объект DB):
Программа-то работает, но хочется сделать всё правильно, а если происходят такие возмущения, значит не всё правильно. Прошу помощи!
0
|
||||||||||||||||
| 23.02.2018, 17:12 | |
|
Ответы с готовыми решениями:
21
QSqlDatabase странное поведение open() QSqlDatabase QSqlDataBase |
|
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
|
|
| 23.02.2018, 17:36 | |
|
Ну не делай так. Зачем тебе многократные переподключения?
0
|
|
|
|
||||||
| 23.02.2018, 17:40 | ||||||
0
|
||||||
|
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
|
|
| 23.02.2018, 18:05 | |
|
Так при чём здесь потоки? Он использует базу по умолчанию, закрывает, но не удаляет её из списка.
0
|
|
|
4 / 4 / 5
Регистрация: 19.08.2016
Сообщений: 137
|
|||
| 23.02.2018, 18:52 [ТС] | |||
|
0
|
|||
|
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
|
|
| 23.02.2018, 19:42 | |
|
Сколько всего баз у тебя? Если одна, то этот класс вообще не нужен. Перенеси подключение в класс главного окна.
1
|
|
|
4 / 4 / 5
Регистрация: 19.08.2016
Сообщений: 137
|
|||||||
| 23.02.2018, 20:53 [ТС] | |||||||
|
И всё же. Если по какой-то причине соединение с базой прервётся, что тогда? Я вот думаю, когда я в главном классе произвожу операции подключения:
И ещё одно. Было бы здорово всю логику работы с БД (подключение, методы работы с данными) хранить в одном классе. В так называемом классе модели. С учётом того, что запросы нужны потокам, возникают сложности. Может быть, передавать указатель на класс модели в конструктор потока? Это, вообще, адекватно? Каковы лучшие практики, как люди обычно организуют код с такими целями?
0
|
|||||||
|
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
|
|
| 23.02.2018, 23:46 | |
|
А соединение пропадает, что ли? Ты проверял вообще какое будет поведение при этом?
В любом случае должно хватать open().
0
|
|
|
4 / 4 / 5
Регистрация: 19.08.2016
Сообщений: 137
|
||||
| 24.02.2018, 09:51 [ТС] | ||||
|
Добавлено через 1 минуту Добавлено через 2 часа 10 минут
0
|
||||
|
|
||
| 24.02.2018, 09:55 | ||
static QAtomicInt поле, это 100% гарантия.В деструкторе свою базу данных нужно удалять из реестра QSqlDatabase::removeDatabase(db.connectionName());
0
|
||
|
4 / 4 / 5
Регистрация: 19.08.2016
Сообщений: 137
|
|
| 24.02.2018, 10:01 [ТС] | |
|
0
|
|
|
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
|
|
| 24.02.2018, 11:01 | |
|
0
|
|
|
4 / 4 / 5
Регистрация: 19.08.2016
Сообщений: 137
|
|||
| 24.02.2018, 12:55 [ТС] | |||
|
Добавлено через 36 секунд Но не это главное. Главное то, что в потоках будет трындец, если так делать Добавлено через 1 час 47 минут
0
|
|||
|
4 / 4 / 5
Регистрация: 19.08.2016
Сообщений: 137
|
||||||||||||||||
| 24.02.2018, 15:39 [ТС] | ||||||||||||||||
|
Ещё один важный нюанс. Нашел на просторах интернета, что такие операции как addDatabase и removeDatabase не являются потокобезопасными.
Получается, что если 2 потока создадут объект класса DB одновременно, то произойдёт нечто нехорошее. Как быть тогда? Может быть создать вот такой мьютекс:
0
|
||||||||||||||||
|
4 / 4 / 5
Регистрация: 19.08.2016
Сообщений: 137
|
||
| 24.02.2018, 15:44 [ТС] | ||
|
У QReadWriteLock вместо одного метода lock методы lockForRead и lockForWrite. В каком случае какой из них использовать?
0
|
||
|
|
|
| 24.02.2018, 15:50 | |
|
На database вешаешь чтение, на add и remove - запись. Вешать нужно совсем глобально, то есть заменять QSqlDatabase.
Но всё это преждевременные скачки. Ты же не собираешься каждые 0.5 секунд открывать и закрывать соединение? Думаю, нет. А если собираешься, тогда стоит задуматься на переопределении QThreadPool'а, чтобы соединения были привязаны к своим потокам, а не к запускаемым классам.
0
|
|
| 24.02.2018, 15:50 | |
|
Помогаю со студенческими работами здесь
20
QSqlDatabase QSqlDataBase QSqlDatabase
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Символьное дифференцирование
igorrr37 13.02.2026
/ *
Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2).
Унарный минус обозначается как !
*/
#include <iostream>
#include <stack>
#include <cctype>. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|