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

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

Страниц: [1] 2 3 4   Вниз
  Печать  
Автор Тема: Работа в SQLite в многопоточном приложении  (Прочитано 28440 раз)
rudireg
Гость
« : Декабрь 10, 2016, 16:02 »

Привет.
Программа работает с SQLite базой.
Хочу что бы выборка информации из базы происходила в разных потоках.
И так... имеем главный поток UI
Главный поток запускает новый поток, в котором идет работа с Базой Данных.
Созданый поток после отработки останавливается и уничтожается.
Соединение с БД  осуществляется в новом созданом потоке при срабатывании слота startProcess
Код:
    QThread*  thread = new QThread();
    DbWorker* db      = new DbWorker();

    QObject::connect(thread , SIGNAL(started()), db, SLOT(startProcess()));
    QObject::connect(db, SIGNAL(finished()), thread , SLOT(quit()));
    QObject::connect(db, SIGNAL(finished()), db, SLOT(deleteLater()));
    QObject::connect(thread , SIGNAL(finished()), thread , SLOT(deleteLater()));

    db->moveToThread(thread);
    thread->start();

И так вопрос.
Если в программе создается лишь 1 поток для получения данных из БД, то все ок.
Но если одновременно создаю 2 потока для получения данных из разных БД то получаю ошибку
Код:
QObject::moveToThread: Current thread (0x2768880) is not the object's thread (0x2768928).
Cannot move to target thread (0x42b078)

Подскажите что не так?

P.S.: Данные программа получает из двух потоков без проблем, но меня смущает это сообщение об ошибке,  то есть данные хоть и получены, но что то идет не так
« Последнее редактирование: Декабрь 10, 2016, 16:05 от rudireg » Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #1 : Декабрь 10, 2016, 16:46 »

объект создается не в том потоке
https://wiki.qt.io/Threads_Events_QObjects

хотя проблемы sqlite и многопоточностью и тормозами более обширны, советую сразу передумать
Записан
rudireg
Гость
« Ответ #2 : Декабрь 10, 2016, 17:02 »

объект создается не в том потоке
https://wiki.qt.io/Threads_Events_QObjects

хотя проблемы sqlite и многопоточностью и тормозами более обширны, советую сразу передумать


Объект который работает с SQLite создается в новом потоке вызовом сигнала startProcess... иными словами он не перемещается из потока в поток, так что ваше утверждение: объект создается не в том потоке здесь не подойдет.
Я мог бы сделать простой проект и сюда загрузить для тестов...
Если вы считаете  что следует забыть, то как же тогда работать с БД ? в одном потоке всегда?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Декабрь 10, 2016, 17:43 »

С SQLite нельзя работать в несколько потоков, так что, либо однопоточно, либо другая БД.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
rudireg
Гость
« Ответ #4 : Декабрь 10, 2016, 18:00 »

С SQLite нельзя работать в несколько потоков, так что, либо однопоточно, либо другая БД.

Вот это для меня новость... честное слово...
ок. А какую БД тогда посоветуете что бы использовать локально на компьютере?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #5 : Декабрь 10, 2016, 18:11 »

Я советую postgresql. Честно. Много лет использую его в продашене. Тем более, любой проект со временем разрастается.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
rudireg
Гость
« Ответ #6 : Декабрь 10, 2016, 18:22 »

Я советую postgresql. Честно. Много лет использую его в продашене. Тем более, любой проект со временем разрастается.
У меня стоит версия Qt 5.5
Драйвер для postgreSQL нужно собирать или уже предустановлен как QSQLITE ?
Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #7 : Декабрь 10, 2016, 19:41 »

Драйвер для postgreSQL нужно собирать или уже предустановлен как QSQLITE ?
Включен в установочный комплект. Если собираете из сорцов, нужно предварительно установить девелоперский пакет Postgres (типа libpq-dev).
При работе с Postgres из разных потоков используйте в каждом потоке свое собственное подключение и все будет нормально.
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #8 : Декабрь 10, 2016, 19:50 »

Using SQLite In Multi-Threaded Applications
Но sqlite это не postgresql. Да. Улыбающийся
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #9 : Декабрь 10, 2016, 23:24 »

Цитировать
С SQLite нельзя работать в несколько потоков

Неужли?

Вообще-то нужно просто создавать соединения в разных потоках.. Этого достаточно, ЕМНИП.
Записан

ArchLinux x86_64 / Win10 64 bit
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #10 : Декабрь 10, 2016, 23:45 »

Я советую postgresql. Честно. Много лет использую его в продашене. Тем более, любой проект со временем разрастается.
А как насчет Firebird или Линтер?
Firebird для стандалоне или одноюзерских приложений по моему самое то что надо..
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #11 : Декабрь 11, 2016, 07:34 »

А как насчет Firebird или Линтер?
Линтер это postgresql, с дополнительными плюшками для разграничения доступа.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #12 : Декабрь 11, 2016, 09:34 »

Цитировать
С SQLite нельзя работать в несколько потоков

Неужли?

Вообще-то нужно просто создавать соединения в разных потоках.. Этого достаточно, ЕМНИП.
Не поможет, ЕМНИП. Так же, как и доступ из нескольких процессов.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #13 : Декабрь 11, 2016, 09:35 »

Я советую postgresql. Честно. Много лет использую его в продашене. Тем более, любой проект со временем разрастается.
А как насчет Firebird или Линтер?
Firebird для стандалоне или одноюзерских приложений по моему самое то что надо..
Юзал я когда-то Firebird, давненько это было, но не смог запустить его под Линем и перешел на постгрес. Преимущество Firebird - вся БД в одном файле, удобно. Но постгресс какбэ стандарт де-факто сейчас. Либо Оракл, либо Постгрес.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #14 : Декабрь 11, 2016, 10:28 »

Цитировать
Не поможет, ЕМНИП. Так же, как и доступ из нескольких процессов.

Почему? У меня все работает...  Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
Страниц: [1] 2 3 4   Вверх
  Печать  
 
Перейти в:  


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