crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в QSqlDatabase в отдельном потоке
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
padla Дата 22.4.2009, 17:02
  То-есть мне придется ручками опять устанавливать соединение?
defnull Дата 21.4.2009, 23:55
 
Цитата
defnull, я к тому, что может быть лучше утяжелить класс потока и избавится от дополнительного класса Database.

Я структуру программы постичь немогу, что и как взамодействует.


Честно говоря я не понимаю как вы предлагаете утяжелить поток. Структура предполагалась следующая. Есть поток например DatabaseThread который должен обрабатывать всё что связанно с БД. Есть класс Command в котором содержиться sql запрос и работа с этим запросом. Есть главное окно программы пусть будет Window. Планировалось сделать следующее: есть интерфейс который поддерживают все классы наследующие Command. Когда мы хотим обратиться к бд мы вызываем сигнал который содержит указательна соответствующую команду унаследованную от Command. Сигнал передаётся потоку и далее функция Command назовём её например start работает уже в потоке где создавалось подключение к БД. ТОесть идея в том что всё что связанно с БД обрабатывается в потоке отвечающим за БД. Как это сделать утяжелив исключительно DataThread я не знаю. Поэтому и решил что нужен дополнительный класс Database который создаётся в секции run() потока DataThread и соединяется потом с кем нужно дял выполнения команд вида Command и отсылания сигналов об ошибках.

Можете привести пример как можно это на ваш взгляд упростить??

з.з.ы чот пытался процитировать а похожу вместо этого ставил + и - за сообщение %)
SABROG Дата 21.4.2009, 21:59
 
Цитата(padla @ 21.4.2009, 18:52) *
Небольшой вопрос. А что произойдет если во время работы программы соединение с БД разорвется?

Это риторический вопрос или он адресован к конкретной реализации взаимодействия с базой данных через разные потоки?

Если первое, то зависит от того написал ли ты проверку на возвращение ошибок при работе с запросами. Если не написал, то возможен любой исход от продолжения нормальной работы программы до AV. А вот с поделками на Delphi обычно это заканчивается выведением окна (иногда бесконечное их создание) о разрыве соединения без дальнейшей возможности к переподключению до перезагрузки программы.

Если вопрос с подтекстом типа, что будет если в этот момент передавались данные, то обычно происходит откат и это никак не влияет на целостность базы данных. Но она должна поддерживать команды BEGIN TRANSACTION ... END TRANSACTION.
padla Дата 21.4.2009, 17:52
  Небольшой вопрос. А что произойдет если во время работы программы соединение с БД разорвется?
Litkevich Yuriy Дата 18.4.2009, 21:43
  defnull, я к тому, что может быть лучше утяжелить класс потока и избавится от дополнительного класса Database.

Я структуру программы постичь немогу, что и как взамодействует.
defnull Дата 18.4.2009, 21:38
 
Цитата(Litkevich Yuriy @ 18.4.2009, 22:27) *
Цитата(defnull @ 19.4.2009, 1:12) *
Есть поток DatabaseThread и класс Database, в котором находится QSqlDatabase.
а для чего они так разделены? Почему не одним классом?


По причине того, что надо обрабатывать в потоке классы Command, в которых содержиться команда SQL и происходит запись и обработка данных. Таким образом Database исключительно обрабатывает ошибки с которыми не может справиться Command (переподключение к БД например) Можно было бы конечно QSqlDatabase наследовать классом Database, но всё равно остаётся проблемы, так как чтобы передавать этот класс Command от например Gui класса классу Database приходится идти через поток. =(

з.ы. Sterr и есть я, просто не со своего компа всё делал..
Litkevich Yuriy Дата 18.4.2009, 21:27
 
Цитата(defnull @ 19.4.2009, 1:12) *
Есть поток DatabaseThread и класс Database, в котором находится QSqlDatabase.
а для чего они так разделены? Почему не одним классом?
defnull Дата 18.4.2009, 21:12
  Добрый день. Столкнулся с такой проблемой.. Есть поток DatabaseThread и класс Database, в котором находится QSqlDatabase. Для того чтобы работа шла параллельно Database создаётся именно в секции run и соотвественно до этого имеем просто указатель на Database. Но возникает проблема в том, что я не могу соединить слоты Database с объектами вне DatabaseThread до тех пор, пока не сработает метод run.. в результате получаю геморой в создании лишних слотов и сигналов для DatabaseThread. Как можно разрулить ситуацию? или проще вообще не заморачиваться над дополнительным потоком с базой ? (проект учебный в принципе, но хотелось быделать по уму)

з.ы. были мысли по поводу соединения сигнала с сигналом, но всё равно надо делать какую-то проверку на то что Database уже выделена память.
Litkevich Yuriy Дата 12.4.2009, 14:25
 
Цитата(Гость_Sterr_* @ 12.4.2009, 17:36) *
Как я понимаю даже после того как объект db уничтожен всё равно можно получить соединение бд в вспомогательной функции через QSqlDatabase db = QSqlDatabase::database(); ?
да. Правильнее этот класс было бы назвать QSqlConnection, т.к. описывает не БД а соединение с ней. Соединений в программе может быть несколько, в том числе и с одной БД.

При вызове статической функции QSqlDatabase::addDatabase("QPSQL"); в нутри этого класса создается соединение.
Этот класс необычный (ты невызываешь конструктор для создания объекта, а статическую функцию). Он подобен "Одиночке" (шаблон проектирования).
Этот вариант называется соеденение по умолчанию (без указания имени). А еще можно задать имя соединения. подробности в описании класса (у нас на сайте на русском языке)

П.С. наиболее употребительные классы модуля SQL создаются как обычные переменные, а не как указатели. И менно благодаря тому, что к соединению можно получить доступ из любого места программы, но незабыв про оговорку насчет потоков.
Если нужно получать доступ к одной и тойже БД из разных потоков, можно просто в каждом потоке создать по соединению ;)
Sterr Дата 12.4.2009, 13:36
  Если правильно вас понял то в run() создаю соединение QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL"); Как я понимаю даже после того как объект db уничтожен всё равно можно получить соединение бд в вспомогательной функции через QSqlDatabase db = QSqlDatabase::database(); ?
Спасибо!
Просмотр темы полностью (откроется в новом окне)
RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 10.7.2025, 8:17